{"id":16690714,"url":"https://github.com/nixman/cmdargs","last_synced_at":"2025-04-10T00:51:10.182Z","repository":{"id":64618674,"uuid":"397967772","full_name":"niXman/cmdargs","owner":"niXman","description":"C++17 library to work with command-line args and config files","archived":false,"fork":false,"pushed_at":"2024-06-26T11:37:55.000Z","size":217,"stargazers_count":5,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-10T00:51:05.070Z","etag":null,"topics":["cpp"],"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/niXman.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":"2021-08-19T14:15:57.000Z","updated_at":"2025-03-16T14:10:44.000Z","dependencies_parsed_at":"2024-02-25T20:30:41.567Z","dependency_job_id":"2df2e10c-8dff-424d-b773-3e2d83bff35c","html_url":"https://github.com/niXman/cmdargs","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/niXman%2Fcmdargs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/niXman%2Fcmdargs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/niXman%2Fcmdargs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/niXman%2Fcmdargs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/niXman","download_url":"https://codeload.github.com/niXman/cmdargs/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248137997,"owners_count":21053775,"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":["cpp"],"created_at":"2024-10-12T16:05:02.715Z","updated_at":"2025-04-10T00:51:10.158Z","avatar_url":"https://github.com/niXman.png","language":"C++","readme":"# Cmdargs\nCommand-line and config files parsing single header-file library for C++17.\n\nOnly long option names is supported.\n\n# The idea\n`Cmdargs` this is an attempt to implement the concept of `if the code is successfully compiled - it works correctly` and `no room for error` and `zero boilerplate code`.\n\n# Capabilities\n- default values for options\n- `optional` and `required` options.\n- option relations: `and`, `or`, `not`.\n- predefined converters for `std::vector`/`std::list`/`std::set`/`std::map`\n\n# Command line example\n\n```cpp\n// using the whole group\n\n// declaring key-words\nstruct: cmdargs::kwords_group {\n    CMDARGS_OPTION_ADD(fname, std::string, \"source file name\")\n    CMDARGS_OPTION_ADD(fsize, std::size_t, \"source file size\", optional)\n} const kwords;\n\nint main(int argc, char **argv) {\n    std::string emsg;\n    auto args = cmdargs::parse_args(\u0026emsg, argc, argv, kwords);\n    if ( !emsg.empty() ) {\n        std::cout \u003c\u003c \"cmdline parse error: \" \u003c\u003c emsg \u003c\u003c std::endl;\n\n        return EXIT_FAILURE;\n    }\n\n    const auto fname = args.get(kwords.fname);\n\n    assert(args.is_set(kwords.fsize));\n    const auto fsize = args.get(kwords.fsize);\n}\n```\n```cpp\n// using structure bindings\n\n// declaring key-words\nstruct: cmdargs::kwords_group {\n    CMDARGS_OPTION_ADD(fname, std::string, \"source file name\")\n    CMDARGS_OPTION_ADD(fsize, std::size_t, \"source file size\", optional)\n} const kwords;\n\nint main(int argc, char **argv) {\n    std::string emsg;\n    \n    // 'fname' - std::optional\u003cstd::string\u003e\n    // 'fsize' - std::optional\u003cstd::size_t\u003e\n    const auto [fname, fsize] = cmdargs::parse_args(\u0026emsg, argc, argv, kwords).optionals(); // or `.values()` can be used\n    if ( !emsg.empty() ) {\n        std::cout \u003c\u003c \"cmdline parse error: \" \u003c\u003c emsg \u003c\u003c std::endl;\n\n        return EXIT_FAILURE;\n    }\n\n    std::cout \u003c\u003c \"fname: is set=\" \u003c\u003c static_cast\u003cbool\u003e(fname) \u003c\u003c \", v=\" \u003c\u003c fname.value() \u003c\u003c std::endl;\n    if ( fsize ) {\n        std::cout \u003c\u003c \"fsize: is set=true, v=\" \u003c\u003c fsize.value() \u003c\u003c std::endl;\n    } else {\n        std::cout \u003c\u003c \"fsize: is set=false, v=\u003cUNINITIALIZED\u003e\" \u003c\u003c std::endl;\n    }\n}\n```\n\n```cpp\n// using part of the options\n\n// declaring key-words\nstruct: cmdargs::kwords_group {\n    CMDARGS_OPTION_ADD(fname, std::string, \"source file name\")\n    CMDARGS_OPTION_ADD(fsize, std::size_t, \"source file size\", optional)\n    CMDARGS_OPTION_ADD(fmode, std::string, \"processing mode\")\n} const kwords;\n\nint main(int argc, char **argv) {\n    std::string emsg;\n    auto args = cmdargs::parse_args(\u0026emsg, argc, argv, kwords.fname, kwords.fmode);\n    if ( !emsg.empty() ) {\n        std::cout \u003c\u003c \"cmdline parse error: \" \u003c\u003c emsg \u003c\u003c std::endl;\n\n        return EXIT_FAILURE;\n    }\n\n    const auto fname = args.get(kwords.fname);\n    const auto fmode = args.get(kwords.fmode);\n}\n```\n\n\n# Config-file example\n\n```cpp\n// declaring key-words\nstruct: cmdargs::kwords_group {\n    CMDARGS_OPTION_ADD(fname, std::string, \"source file name\")\n    CMDARGS_OPTION_ADD(fsize, std::size_t, \"source file size\", optional)\n} const kwords;\n\nint main(int argc, char **argv) {\n    std::ifstream is;\n    std::string emsg;\n    auto set = cmdargs::from_file(\u0026emsg, is, kwords.fname, kwords.fsize);\n    if ( !emsg.empty() ) {\n        std::cout \u003c\u003c \"file parse error: \" \u003c\u003c emsg \u003c\u003c std::endl;\n\n        return EXIT_FAILURE;\n    }\n\n    const auto fname = args.get(kwords.fname);\n    const auto fsize = args.get(kwords.fsize);\n}\n```\n\n# Show help message\n\n```cpp\n// for all the keywords\n\n// declaring key-words\nstruct: cmdargs::kwords_group {\n    CMDARGS_OPTION_ADD(fname, std::string, \"source file name\")\n    CMDARGS_OPTION_ADD(fsize, std::size_t, \"source file size\", optional)\n} const kwords;\n\nint main(int argc, char **argv) {\n    cmdargs::show_help(std::cout, argv[0], kwords);\n}\n```\n```cpp\n// for selected keywords only\n\n// declaring key-words\nstruct: cmdargs::kwords_group {\n    CMDARGS_OPTION_ADD(fname, std::string, \"source file name\")\n    CMDARGS_OPTION_ADD(fsize, std::size_t, \"source file size\", optional)\n} const kwords;\n\nint main(int argc, char **argv) {\n    std::string emsg;\n    auto args = cmdargs::parse_args(\u0026emsg, argc, argv, kwords.fname, kwords.fsize);\n\n    cmdargs::show_help(std::cout, argv[0], args);\n}\n```\n\n# TODO\n- to implement check for child options\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnixman%2Fcmdargs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnixman%2Fcmdargs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnixman%2Fcmdargs/lists"}