{"id":15047302,"url":"https://github.com/mickaelblet/args","last_synced_at":"2026-02-03T06:17:22.167Z","repository":{"id":49376317,"uuid":"487575454","full_name":"MickaelBlet/Args","owner":"MickaelBlet","description":"Parse and store options from argc and argv","archived":false,"fork":false,"pushed_at":"2025-02-11T06:23:58.000Z","size":532,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-04-15T10:14:25.028Z","etag":null,"topics":["argparser","argv","argv-parser","cpp","cpp98","cpp98-compatible","header-only-library"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MickaelBlet.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-05-01T15:41:19.000Z","updated_at":"2025-02-11T06:23:20.000Z","dependencies_parsed_at":"2024-03-11T01:24:56.227Z","dependency_job_id":"0feb5e31-a3c2-405f-a86e-adb308efbac7","html_url":"https://github.com/MickaelBlet/Args","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MickaelBlet%2FArgs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MickaelBlet%2FArgs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MickaelBlet%2FArgs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MickaelBlet%2FArgs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MickaelBlet","download_url":"https://codeload.github.com/MickaelBlet/Args/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249048742,"owners_count":21204306,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["argparser","argv","argv-parser","cpp","cpp98","cpp98-compatible","header-only-library"],"created_at":"2024-09-24T20:56:15.658Z","updated_at":"2026-02-03T06:17:22.161Z","avatar_url":"https://github.com/MickaelBlet.png","language":"C++","readme":"# Args\n\nParse and store options from `argc` and `argv`.\nInspired by the Python library [argparse](https://python.readthedocs.io/en/latest/library/argparse.html).\nHeader-only library available at [single_include/blet/args.h](single_include/blet/args.h).\nDocumentation available at [documentation](#documentation).\n\n## Quick Start\n\n```cpp\n#include \u003ciostream\u003e\n\n#include \"blet/args.h\"\n\nenum eLogLevel {\n    EMERG_LEVEL = 0,\n    ALERT_LEVEL,\n    CRITICAL_LEVEL,\n    ERROR_LEVEL,\n    WARNING_LEVEL,\n    NOTICE_LEVEL,\n    INFO_LEVEL,\n    DEBUG_LEVEL\n};\n\nvoid argToLogLevel(eLogLevel\u0026 logLevel, bool /*isExists*/, const std::string\u0026 argument) {\n    if (argument == \"EMERG\" || argument == \"0\") {\n        logLevel = EMERG_LEVEL;\n    }\n    else if (argument == \"ALERT\" || argument == \"1\") {\n        logLevel = ALERT_LEVEL;\n    }\n    else if (argument == \"CRITICAL\" || argument == \"2\") {\n        logLevel = CRITICAL_LEVEL;\n    }\n    else if (argument == \"ERROR\" || argument == \"3\") {\n        logLevel = ERROR_LEVEL;\n    }\n    else if (argument == \"WARNING\" || argument == \"4\") {\n        logLevel = WARNING_LEVEL;\n    }\n    else if (argument == \"NOTICE\" || argument == \"5\") {\n        logLevel = NOTICE_LEVEL;\n    }\n    else if (argument == \"INFO\" || argument == \"6\") {\n        logLevel = INFO_LEVEL;\n    }\n    else if (argument == \"DEBUG\" || argument == \"7\") {\n        logLevel = DEBUG_LEVEL;\n    }\n}\n\nint main(int argc, char* argv[]) {\n    eLogLevel logLevel = INFO_LEVEL;\n\n    blet::Args args;\n    // set message printed at version action option\n    args.setVersion(\"Version: 0.0.0\");\n    // add required positional ARGUMENT\n    args.addArgument(\"ARGUMENT\").help(\"help of positional argument\").required();\n    // add version option (-v, --version)\n    args.addArgument(\"-v\").flag(\"--version\").help(\"print version\").action(args.VERSION);\n    // add multiargument option (-o, --option)\n    args.addArgument(args.vector(\"-o\", \"--option\")).help(\"help of option\").nargs(2).metavar(\"OPT1 OPT2\");\n    // add choise option (-l, --log-level) with \"dest\" function\n    args.addArgument(\"--log-level\")\n        .flag(\"-l\")\n        .help(\"help of log-level\")\n        .metavar(\"LEVEL\")\n        .valid(new blet::Args::ValidChoise(args.vector(\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"EMERG\", \"ALERT\",\n                                                       \"CRITICAL\", \"ERROR\", \"WARNING\", \"NOTICE\", \"INFO\", \"DEBUG\")))\n        .defaults(\"INFO\")\n        .dest(logLevel, \u0026argToLogLevel); // fill logLevel using argToLogLevel\n\n    try {\n        args.setStrict()           // throw exception with additional arguments\n            .setAlternative()      // accept simple '-' with a long flag\n            .setAbbreviate()       // accept abbreviated long options (e.g., --ver for --version)\n            .setHelpException()    // throw exception when help flag is called\n            .setVersionException() // throw exception when version flag is called\n            .parseArguments(argc, argv); // add help option automatically\n    }\n    catch (const blet::Args::VersionException\u0026 e) {\n        std::cout \u003c\u003c e.what() \u003c\u003c std::endl;\n        return 0;\n    }\n    catch (const blet::Args::HelpException\u0026 e) {\n        std::cout \u003c\u003c e.what() \u003c\u003c std::endl;\n        return 0;\n    }\n    catch (const blet::Args::ParseArgumentException\u0026 e) {\n        std::cerr \u003c\u003c args.getBinaryName() \u003c\u003c \": \" \u003c\u003c e.what();\n        std::cerr \u003c\u003c \" -- '\" \u003c\u003c e.argument() \u003c\u003c \"'\" \u003c\u003c std::endl;\n        return 1;\n    }\n\n    std::cout \u003c\u003c \"ARGUMENT: \" \u003c\u003c args[\"ARGUMENT\"] \u003c\u003c '\\n';\n    // check if option exists\n    if (args[\"--option\"]) {\n        std::cout \u003c\u003c \"--option: \" \u003c\u003c args[\"--option\"][0] \u003c\u003c \", \" \u003c\u003c args[\"--option\"][1] \u003c\u003c '\\n';\n    }\n    std::cout \u003c\u003c \"--log-level: \";\n    switch (logLevel) {\n        case EMERG_LEVEL:\n            std::cout \u003c\u003c \"EMERG\";\n            break;\n        case ALERT_LEVEL:\n            std::cout \u003c\u003c \"ALERT\";\n            break;\n        case CRITICAL_LEVEL:\n            std::cout \u003c\u003c \"CRITICAL\";\n            break;\n        case ERROR_LEVEL:\n            std::cout \u003c\u003c \"ERROR\";\n            break;\n        case WARNING_LEVEL:\n            std::cout \u003c\u003c \"WARNING\";\n            break;\n        case NOTICE_LEVEL:\n            std::cout \u003c\u003c \"NOTICE\";\n            break;\n        case INFO_LEVEL:\n            std::cout \u003c\u003c \"INFO\";\n            break;\n        case DEBUG_LEVEL:\n            std::cout \u003c\u003c \"DEBUG\";\n            break;\n    }\n    std::cout \u003c\u003c std::endl;\n\n    return 0;\n}\n```\n\n```\n$ ./a.out --version\nVersion: 0.0.0\n$ ./a.out -h\nusage: a.out [-h] [-l LEVEL] [-o OPT1 OPT2] [-v] -- ARGUMENT\n\npositional arguments:\n  ARGUMENT              help of positional argument (required)\n\noptional arguments:\n  -h, --help            show this help message and exit\n  -l, --log-level LEVEL\n                        help of log-level (default: INFO)\n  -o, --option OPT1 OPT2\n                        help of option\n  -v, --version         print version\n$ ./a.out\n./a.out: argument is required -- 'ARGUMENT'\n$ ./a.out 42 -log-level Foo\n./a.out: \"Foo\" is not a valid choise (\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"EMERG\", \"ALERT\", \"CRITICAL\", \"ERROR\", \"WARNING\", \"NOTICE\", \"INFO\", \"DEBUG\") -- '-l'\n$ ./a.out 42\nARGUMENT: 42\n--log-level: INFO\n$ ./a.out 42 --log-level=DEBUG --option Foo\n./a.out: bad number of argument -- 'option'\n$ ./a.out 42 -l7 -o Foo Bar\nARGUMENT: 42\n--option: Foo, Bar\n--log-level: DEBUG\n```\n\n## Build\n\n```bash\n# Static Release with install\nmkdir build; pushd build; cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=0 .. \u0026\u0026 make -j \u0026\u0026 make install; popd\n# Dynamic Release with install\nmkdir build; pushd build; cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=1 .. \u0026\u0026 make -j \u0026\u0026 make install; popd\n\n# Static Release C++98 with install\nmkdir build; pushd build; cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=98 -DBUILD_SHARED_LIBS=0 .. \u0026\u0026 make -j \u0026\u0026 make install; popd\n# Dynamic Release C++98 with install\nmkdir build; pushd build; cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=98 -DBUILD_SHARED_LIBS=1 .. \u0026\u0026 make -j \u0026\u0026 make install; popd\n\n# Install with custom directory\nmkdir build; pushd build; cmake -DCMAKE_INSTALL_PREFIX=\"YOUR_INSTALL_PATH\" .. \u0026\u0026 make -j \u0026\u0026 make install; popd\n\n# Example\nmkdir build; pushd build; cmake -DBUILD_EXAMPLE=1 .. \u0026\u0026 make -j; popd\n\n# Single Include + Test\nmkdir build; pushd build; cmake -DBUILD_SINGLE_INCLUDE=1 -DBUILD_TESTING=1 .. \u0026\u0026 make -j; popd\n\n# Tests + Coverage\nmkdir build; pushd build; cmake -DBUILD_SHARED_LIBS=0 -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=1 -DBUILD_COVERAGE=1 -DCMAKE_CXX_STANDARD=11 .. \u0026\u0026 make -j \u0026\u0026 make test -j; popd\n```\n\n## Option format\n\nShort format\n```bash\n\"-b\"          # [b] == true\n\"-s\" \"Simple\" # [s] == Simple\n\"-sSimple\"    # [s] == Simple\n\"-s=Simple\"   # [s] == Simple\n\"-bsSimple\"   # [b] == true and [s] == Simple\n\"-bs=Simple\"  # [b] == true and [s] == Simple\n```\n\nLong format\n```bash\n\"--boolean\"         # [boolean] == true\n\"--simple\" \"Simple\" # [simple] == Simple\n\"--simple=Simple\"   # [simple] == Simple\n\"-simple\" \"Simple\"  # (alternative) [simple] == Simple\n\"-simple=Simple\"    # (alternative) [simple] == Simple\n\"--ver\"             # (abbreviated) [version] == true (if setAbbreviate is enabled)\n```\n\n## Methods\n\n### addArgument\n\nDefine how a single command-line argument should be parsed.\n\n```cpp\nstd::vector\u003cdouble\u003e doublesFromArg;\nblet::Args args;\nargs.addArgument({\"-E\", \"--example\"}) // Either a name or a list of option strings, e.g. foo or -f, --foo\n    .flag(\"--new-example\")            // Add option strings e.g. -f, --foo\n    .action(args.INFINITE)            // The basic type of action to be taken when this argument is encountered at the command line\n    .help(\"help message\")             // A brief description of what the argument does\n    .required(true)                   // Whether or not the command-line option may be omitted (optionals only)\n    .metavar(\"ARGUMENT\")              // A name for the argument in usage messages\n    .nargs(1)                         // The number of command-line arguments that should be consumed\n    .defaults({\"0\"})                  // A list of default string argument values\n    .valid(new blet::Args::ValidMinMax(0, 100)) // Validate class from IValid interface\n    .dest(doublesFromArg);            // Fill argument in destination\n```\n\n#### Definitions\n\n|Method|Description|\n|---|---|\n|[action](docs/argument.md#action)|The basic type of action to be taken when this argument is encountered at the command line.|\n|[defaults](docs/argument.md#defaults)|A list of default string argument values.|\n|[dest](docs/argument.md#dest)|Fill argument in destination.|\n|[flag](docs/argument.md#flag)|Add option strings e.g. -f, --foo|\n|[help](docs/argument.md#help-1)|A brief description of what the argument does.|\n|[metavar](docs/argument.md#metavar)|A name for the argument in usage messages.|\n|[nargs](docs/argument.md#nargs)|The number of command-line arguments that should be consumed.|\n|[required](docs/argument.md#required)|Whether or not the command-line option may be omitted (optionals only).|\n|[valid](docs/argument.md#valid)|Validate argument from IValid interface.|\n\n### parseArguments\n\nConvert argument strings to objects and assign them as attributes of the args map.  \nPrevious calls to [addArgument](docs/args.md#addargument) determine exactly what objects are created and how they are assigned.\n\n```cpp\nvoid parseArguments(int argc, char* argv[]);\n```\n\n#### Parse Options\n\n```cpp\nblet::Args\u0026 setStrict(); // Throw exception if not all arguments are used; otherwise, you can take additional arguments with getAdditionalArguments method\nblet::Args\u0026 setAlternative(); // Enable parsing to accept long options with only one '-' character\nblet::Args\u0026 setAbbreviate(); // Enable parsing to accept abbreviated long options (e.g., --ver matches --version); throws on ambiguity\nblet::Args\u0026 setHelpException(); // Throw a HelpException when help action is present in arguments; otherwise, exit(0) after outputting usage to stdout\nblet::Args\u0026 setVersionException(); // Throw a VersionException when version action is present in arguments; otherwise, exit(0) after outputting usage to stdout\n```\n\n## Abbreviated Options\n\nWhen `setAbbreviate()` is enabled, long options can be specified by any unambiguous prefix:\n\n```cpp\nblet::Args args;\nargs.addArgument(\"--version\").action(args.STORE_TRUE);\nargs.addArgument(\"--verbose\").action(args.STORE_TRUE);\nargs.setAbbreviate();\n```\n\n```bash\n./program --vers   # matches --version (unambiguous)\n./program --verb   # matches --verbose (unambiguous)\n./program --ver    # ERROR: ambiguous (matches both --version and --verbose)\n./program --versio # matches --version (unambiguous)\n```\n\n**Important notes:**\n- Only works with long options (starting with `--`)\n- Exact matches always take precedence over abbreviations\n- Throws `ParseArgumentException` if abbreviation is ambiguous\n- Can be combined with `setAlternative()` and other parsing options\n\n## Vector\n\nVector is an object that can be initialized with an initializer list, single string, or for C++98 with the `vector` static method.\n\n```cpp\nblet::Args args;\nargs.addArgument(\"--simple\");\nargs.addArgument({\"-s\", \"--simple\"});\nargs.addArgument(\"-s\").flag(\"--simple\");\nargs.addArgument(args.vector(\"-s\", \"--simple\"));     // C++98\nargs.addArgument((const char*[]){\"-s\", \"--simple\"}); // C++98\n```\n\n## Documentation\n\n### Args Basic Methods\n\n|Method|Description|\n|---|---|\n|[addArgument](docs/args.md#addargument)|Define how a single command-line argument should be parsed.|\n|[parseArguments](docs/args.md#parsearguments)|Convert argument strings to objects and assign them as attributes of the args map.\u003cbr/\u003ePrevious calls to [addArgument](docs/args.md#addargument) determine exactly what objects are created and how they are assigned.\u003cbr/\u003eIf called without help action, defines '-h' and '--help' if not used.|\n\n### Custom Usage\n\n|Method|Description|\n|---|---|\n|[getDescription](docs/usage.md#getdescription)|Get the description message.|\n|[getEpilog](docs/usage.md#getepilog)|Get the epilog message.|\n|[getUsage](docs/usage.md#getusage)|Get the usage message.|\n|[setDescription](docs/usage.md#setdescription)|Set the description in usage message.|\n|[setEpilog](docs/usage.md#setepilog)|Set the epilog in usage message.|\n|[setUsage](docs/usage.md#setusage)|Set the usage message.|\n|[setUsageWidth](docs/usage.md#setusagewidth)|Set the Usage Widths.|\n\n\n### Args Methods\n\n|Method|Description|\n|---|---|\n|[argumentExists](docs/args.md#argumentexists)|Check if argument exists.|\n|[clear](docs/args.md#clear)|Clear and reset with default values.|\n|[getAdditionalArguments](docs/args.md#getadditionalarguments)|Get the vector of additional arguments.|\n|[getArgument](docs/args.md#getargument)|Get the argument object.|\n|[getBinaryName](docs/args.md#getbinaryname)|Get the binary name.|\n|[getVersion](docs/args.md#getversion)|Get the version message.|\n|[isAbbreviate](docs/args.md#isabbreviate)|Get the status of abbreviated options.|\n|[isAlternative](docs/args.md#isalternative)|Get the status of alternative.|\n|[isHelpException](docs/args.md#ishelpexception)|Get the status of helpException.|\n|[isStrict](docs/args.md#isstrict)|Get the status of strict.|\n|[isVersionException](docs/args.md#isversionexception)|Get the status of versionException.|\n|[removeArguments](docs/args.md#removearguments)|Remove previously added arguments.|\n|[setAbbreviate](docs/args.md#setabbreviate)|Enable parsing to accept abbreviated long options (e.g., --ver matches --version).|\n|[setAlternative](docs/args.md#setalternative)|Enable parsing to accept long options with only one '-' character.|\n|[setBinaryName](docs/args.md#setbinaryname)|Set the binary name.|\n|[setHelpException](docs/args.md#sethelpexception)|Throw a HelpException when help action is present in arguments; otherwise, exit(0) after outputting usage to stdout.|\n|[setStrict](docs/args.md#setstrict)|Throw exception if not all arguments are used; otherwise, you can take additional arguments with getAdditionalArguments method.|\n|[setVersion](docs/args.md#setversion)|Set the version message.|\n|[setVersionException](docs/args.md#setversionexception)|Throw a VersionException when version action is present in arguments; otherwise, exit(0) after outputting version to stdout.|\n|[updateArgument](docs/args.md#updateargument)|Get the ref. of argument from name or flag.|\n\n### Args::Argument Construct Methods\n\n|Method|Description|\n|---|---|\n|[action](docs/argument.md#action)|Add an action when this argument is encountered at the command line.|\n|[defaults](docs/argument.md#defaults)|Define the default string values.|\n|[dest](docs/argument.md#dest)|Define a reference to an object to insert the value after [parseArguments](docs/args.md#parsearguments) method.|\n|[flag](docs/argument.md#flag)|Add flag to argument object.|\n|[help](docs/argument.md#help-1)|Set the help description message for this argument.|\n|[metavar](docs/argument.md#metavar)|A name for the argument in usage messages.|\n|[nargs](docs/argument.md#nargs)|The number of command-line arguments that should be consumed by this object.|\n|[required](docs/argument.md#required)|Whether or not the command-line argument may be omitted.|\n|[valid](docs/argument.md#valid)|You can check format of argument with IValid interface.|\n\n### Args::Argument::Action Types\n\n|Enum|Description|\n|---|---|\n|[APPEND](docs/argument.md#append)|This stores a list, and appends each argument value to the list.\u003cbr/\u003eIt is useful to allow an option to be specified multiple times.|\n|[EXTEND](docs/argument.md#extend)|This stores a list, and extends each argument value to the list.|\n|[HELP](docs/argument.md#help)|This is used to create the help flag.|\n|[INFINITE](docs/argument.md#infinite)|This stores a list.|\n|[NONE](docs/argument.md#none)|This just stores the argument's value. **This is the default action**.|\n|[STORE_FALSE](docs/argument.md#store_false)|This is used to store the value `false`.|\n|[STORE_TRUE](docs/argument.md#store_true)|This is used to store the value `true`.|\n|[VERSION](docs/argument.md#version)|This is used to define the version flag.|\n\n### Args::Argument Access Methods\n\n|Method|Description|\n|---|---|\n|[count](docs/argument.md#count)|After [parseArguments](docs/args.md#parsearguments) method check if number of this argument in argv.|\n|[getAction](docs/argument.md#getaction)|Get [action](#argsargumentaction-types) option.|\n|[getDefault](docs/argument.md#getdefault)|Get the default value of argument.|\n|[getDefaults](docs/argument.md#getdefaults)|Get the default(s) value(s) of this argument.|\n|[getHelp](docs/argument.md#gethelp)|Get [help](docs/argument.md#help-1) option.|\n|[getMetavar](docs/argument.md#getmetavar)|Get [metavar](docs/argument.md#metavar) option.|\n|[getNameOrFlags](docs/argument.md#getnameorflags)|Get the name or flag(s) of this argument.|\n|[getNargs](docs/argument.md#getnargs)|Get [nargs](docs/argument.md#nargs) option.|\n|[getNumber](docs/argument.md#getnumber)|Get Number if [isNumber](docs/argument.md#isnumber).|\n|[getString](docs/argument.md#getstring)|Get the string format of this argument.|\n|[isExists](docs/argument.md#isexists)|After [parseArguments](docs/args.md#parsearguments) method check if this argument is present in *argv*.|\n|[isNumber](docs/argument.md#isnumber)|Check if this argument is a number (\"1234aaa\" is true with 1234 like number).|\n|[isRequired](docs/argument.md#isrequired)|Get [required](docs/argument.md#required) option.|\n|[operator bool()](docs/argument.md#operator-bool)|Check if argument object [isExists](docs/argument.md#isexists).|\n|[operator std::string()](docs/argument.md#operator-stdstring)|Call [getString](docs/argument.md#getstring) method.|\n|[operator std::vector\\\u003cstd::string\u003e()](docs/argument.md#operator-stdvectorstdstring)|If the argument object contains a lot of one argument, you can get a std::vector of std::string.|\n|[operator std::vector\\\u003cstd::vector\\\u003cstd::string\u003e \u003e()](docs/argument.md#operator-stdvectorstdvectorstdstring-)|If the argument object contains a lot of one argument with number of argument ([nargs](docs/argument.md#nargs)) bigger than one, you can get a std::vector of std::vector of std::string.|\n|[operator T()](docs/argument.md#operator-t)|Call the [getNumber](docs/argument.md#getnumber) method with your custom type.|\n\n### Examples\n\nFor more examples, see [docs/examples.md](docs/examples.md).","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmickaelblet%2Fargs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmickaelblet%2Fargs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmickaelblet%2Fargs/lists"}