{"id":17788713,"url":"https://github.com/devel0/netcore-cmdline","last_synced_at":"2025-06-18T20:39:13.960Z","repository":{"id":65408856,"uuid":"205257194","full_name":"devel0/netcore-cmdline","owner":"devel0","description":"netcore command line parser","archived":false,"fork":false,"pushed_at":"2024-02-17T11:19:16.000Z","size":8428,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-09T20:49:35.485Z","etag":null,"topics":["cmdline-parser","completions","netcore"],"latest_commit_sha":null,"homepage":"https://devel0.github.io/netcore-cmdline/api/SearchAThing.Cmdline.html","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/devel0.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}},"created_at":"2019-08-29T22:00:45.000Z","updated_at":"2024-02-17T11:18:07.000Z","dependencies_parsed_at":"2024-02-17T12:24:42.894Z","dependency_job_id":null,"html_url":"https://github.com/devel0/netcore-cmdline","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/devel0/netcore-cmdline","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devel0%2Fnetcore-cmdline","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devel0%2Fnetcore-cmdline/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devel0%2Fnetcore-cmdline/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devel0%2Fnetcore-cmdline/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/devel0","download_url":"https://codeload.github.com/devel0/netcore-cmdline/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devel0%2Fnetcore-cmdline/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260630536,"owners_count":23039122,"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":["cmdline-parser","completions","netcore"],"created_at":"2024-10-27T10:20:55.790Z","updated_at":"2025-06-18T20:39:08.949Z","avatar_url":"https://github.com/devel0.png","language":"C#","readme":"# netcore-cmdline\n\n[![NuGet Badge](https://buildstats.info/nuget/netcore-cmdline)](https://www.nuget.org/packages/netcore-cmdline/)\n\n.NET core command line parser\n\n- [API Documentation](https://devel0.github.io/netcore-cmdline/html/annotated.html)\n- [Changelog](https://github.com/devel0/netcore-cmdline/commits/master)\n\n\u003chr/\u003e\n\n\u003c!-- TOC --\u003e\n* [Features](#features)\n* [Quickstart](#quickstart)\n  + [Basic flags](#basic-flags)\n  + [Flags with value](#flags-with-value)\n  + [Parameters](#parameters)\n  + [Parameters array](#parameters-array)\n  + [Bash completion](#bash-completion)\n  + [Sub parser](#sub-parser)\n* [API Documentation](#api-documentation)\n* [how this project was built](#how-this-project-was-built)\n\u003c!-- TOCEND --\u003e\n\n\u003chr/\u003e\n\n## Features\n\n- multi level nested command parsers\n- mandatory/optional short/long flags with/without value ; global flags\n- parameter and array of parameters\n- automatic standard usage ( color supported )\n- automatic bash completions\n\n## Quickstart\n\n```sh\ndotnet new console --use-program-main -n test\ncd test\ndotnet add package netcore-cmdline\ndotnet run\n```\n\n### Basic flags\n\n\u003e to execute `example-01` from command line can set path with something like `export PATH=$PATH:~/opensource/netcore-cmdline/examples/example-01/bin/Debug/netcoreapp3.0`\n\n```csharp\nusing SearchAThing;\n\nnamespace example_01\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            // create main parser\n            CmdlineParser.Create(\"sample application\", (parser) =\u003e\n            {\n                var xflag = parser.AddShort(\"x\", \"my first flag\");\n                var yflag = parser.AddShort(\"y\", \"my second flag\");                \n\n                // global flag with auto invoked action when matches that print usage for nested MatchParser\n                parser.AddShort(\"h\", \"show usage\", null, (item) =\u003e item.MatchParser.PrintUsage());\n\n                // entrypoint for parser level cmdline match\n                parser.OnCmdlineMatch(() =\u003e\n                {\n                    if (xflag) System.Console.WriteLine($\"x flag used\");\n                    if (yflag) System.Console.WriteLine($\"y flag used\");\n                });\n\n                // call this once at toplevel parser only\n                parser.Run(args);\n            });\n        }\n    }\n}\n```\n\n![](data/images/quickstart-01.png)\n\n### Flags with value\n\n```csharp\nusing SearchAThing;\n\nnamespace example_01\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            CmdlineParser.Create(\"sample application\", (parser) =\u003e\n            {\n                var xflag = parser.AddShort(\"x\", \"my first flag\", \"XVAL\");\n                var yflag = parser.AddShort(\"y\", \"my second flag\", \"YVAL\");\n                var vflag = parser.AddShortLong(\"v\", \"value\", \"a value flag\", \"VAL\");\n\n                parser.AddShortLong(\"h\", \"help\", \"show usage\", null, (item) =\u003e item.MatchParser.PrintUsage());\n\n                parser.OnCmdlineMatch(() =\u003e\n                {\n                    if (xflag) System.Console.WriteLine($\"x flag used [{(string)xflag}]\");\n                    if (yflag) System.Console.WriteLine($\"y flag used [{(string)yflag}]\");\n                    if (vflag) System.Console.WriteLine($\"value specified [{(string)vflag}]\");\n                });\n\n                parser.Run(args);\n            });\n        }\n    }\n}\n```\n\n```sh\ndevel0@tuf:~$ example-01 -h\n\nUsage: example-01 FLAGS\n\nsample application\n\nOptional flags:\n  -x=XVAL          my first flag\n  -y=YVAL          my second flag\n  -v,--value=VAL   a value flag\n\nGlobal flags:\n  -h,--help        show usage\n\n\ndevel0@tuf:~$ example-01 -x 1 -y 2 -v 3\nx flag used [1]\ny flag used [2]\nvalue specified [3]\ndevel0@tuf:~$ example-01 -x 1 -y 2 --value 3\nx flag used [1]\ny flag used [2]\nvalue specified [3]\ndevel0@tuf:~$ example-01 -x 1 -y 2 -v=3\nx flag used [1]\ny flag used [2]\nvalue specified [3]\ndevel0@tuf:~$ example-01 -x 1 -y 2 --value=3\nx flag used [1]\ny flag used [2]\nvalue specified [3]\n```\n\n### Parameters\n\n```csharp\nusing SearchAThing;\n\nnamespace example_01\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            CmdlineParser.Create(\"sample application\", (parser) =\u003e\n            {\n                var xflag = parser.AddShort(\"x\", \"test flag\");\n                var param1 = parser.AddParameter(\"param1\", \"first parameter\");\n                var param2 = parser.AddParameter(\"param2\", \"second parameter\");\n\n                parser.AddShort(\"h\", \"show usage\", null, (item) =\u003e item.MatchParser.PrintUsage());\n\n                parser.OnCmdlineMatch(() =\u003e\n                {\n                    System.Console.WriteLine(parser);\n                });\n\n                parser.Run(args);\n            });\n        }\n    }\n}\n```\n\n```sh\ndevel0@tuf:~$ example-01 -x a bcd\nTYPE        SHORT-NAME   LONG-NAME   DESCRIPTION        GLOBAL   MANDATORY   MATCHES   VALUE\n--------------------------------------------------------------------------------------------\nflag        x                        test flag                                  X           \nflag        h                        show usage           X                                 \nparameter   param1                   first parameter                            X      a    \nparameter   param2                   second parameter                           X      bcd  \n\n```\n\n### Parameters array\n\n```csharp\nusing SearchAThing;\nusing System.Linq;\n\nnamespace example_01\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            CmdlineParser.Create(\"sample application\", (parser) =\u003e\n            {\n                var xflag = parser.AddShort(\"x\", \"test flag\");\n                var param1 = parser.AddParameter(\"param1\", \"first parameter\");\n                var param2 = parser.AddParameterArray(\"param2\", \"other params\");\n\n                parser.AddShort(\"h\", \"show usage\", null, (item) =\u003e item.MatchParser.PrintUsage());\n\n                parser.OnCmdlineMatch(() =\u003e\n                {\n                    System.Console.WriteLine($\"param2 count = {param2.Count()}\");\n                    System.Console.WriteLine(parser);\n                });\n\n                parser.Run(args);\n            });\n        }\n    }\n}\n```\n\n```sh\ndevel0@tuf:~$ example-01 a\nparam2 count = 0\nTYPE             SHORT-NAME   LONG-NAME   DESCRIPTION       GLOBAL   MANDATORY   MATCHES   VALUE\n------------------------------------------------------------------------------------------------\nflag             x                        test flag                                             \nflag             h                        show usage          X                                 \nparameter        param1                   first parameter                           X      a    \nparameterArray   param2                   other params                                          \n\ndevel0@tuf:~$ example-01 a b c\nparam2 count = 2\nTYPE             SHORT-NAME   LONG-NAME   DESCRIPTION       GLOBAL   MANDATORY   MATCHES   VALUE      \n------------------------------------------------------------------------------------------------------\nflag             x                        test flag                                                   \nflag             h                        show usage          X                                       \nparameter        param1                   first parameter                           X      a          \nparameterArray   param2                   other params                              X      [ \"b\",\"c\" ]\n\n```\n\n### Bash completion\n\n```csharp\nusing SearchAThing;\nusing System.Linq;\n\nnamespace example_01\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            CmdlineParser.Create(\"sample application\", (parser) =\u003e\n            {\n                var cmd1 = parser.AddCommand(\"cmd1\", \"sample command 1\");\n                var cmd2 = parser.AddCommand(\"cmd2\", \"sample command 2\");\n\n                var flag1 = parser.AddShortLong(\"f1\", \"test-flag1\", \"sample flag 1\");\n                var flag2 = parser.AddShortLong(\"f2\", \"test-flag2\", \"sample flag 2\");\n                var flag3 = parser.AddShortLong(\"f3\", \"my-flag3\", \"sample flag 3\");\n\n                parser.AddShort(\"h\", \"show usage\", null, (item) =\u003e item.MatchParser.PrintUsage());\n\n                var param = parser.AddParameter(\"item\", \"an odd number between 51 and 63\");\n                param.OnCompletion((str) =\u003e\n                {\n                    var validSet = Enumerable.Range(50, 15).Where(r =\u003e r % 2 != 0).Select(w =\u003e w.ToString());\n\n                    return validSet.Where(r =\u003e r.StartsWith(str));\n                });\n\n                parser.Run(args);\n            });\n        }\n    }\n}\n```\n\n- debugging\n\n```sh\ndevel0@tuf:~$ SHOW_COMPLETIONS=2 example-01\ncmd1\ncmd2\ndevel0@tuf:~$ SHOW_COMPLETIONS=2 example-01 cmd2\n51\n53\n55\n57\n59\n61\n63\ndevel0@tuf:~$ SHOW_COMPLETIONS=2 example-01 cmd2 5\n51\n53\n55\n57\n59\ndevel0@tuf:~$ SHOW_COMPLETIONS=2 example-01 cmd2 6\n61\n63\ndevel0@tuf:~$ SHOW_COMPLETIONS=2 example-01 cmd2 63\ndevel0@tuf:~$\n```\n\n- apply to bash completions\n\nedit `/etc/bash_completion.d/example-01` as follow ( note `${COM_LINE:2}` to skip first dummy arg that is friendly name of the program )\n\n```sh\n_fn() {\n        #echo \u003e\u003e /tmp/completion-debug\n        #echo \"COMP_LINE=${COMP_LINE}\" \u003e\u003e /tmp/completion-debug\n        #SHOW_COMPLETIONS=2 example-01 ${COMP_LINE:2} \u003e\u003e /tmp/completion-debug\n\n        COMPREPLY=($(SHOW_COMPLETIONS=2 example-01 ${COMP_LINE:2}))\n}\n\ncomplete -F _fn example-01\n```\n\nsource it with `. /etc/bash_completion` then try as follows\n\n![](data/images/quickstart-02.gif)\n\n### Sub parser\n\n```csharp\nusing SearchAThing;\n\nnamespace example_01\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            CmdlineParser.Create(\"sample application\", (parser) =\u003e\n            {\n                var cmdConfig = parser.AddCommand(\"config\", \"configuration\", (pConfig) =\u003e\n                {\n                    pConfig.AddCommand(\"show\", \"show current config\", (pConfigShow) =\u003e\n                    {\n                        pConfigShow.OnCmdlineMatch(() =\u003e System.Console.WriteLine($\"showing configuration...\"));\n                    });\n\n                    pConfig.AddCommand(\"update\", \"update config item\", (pConfigUpdate) =\u003e\n                    {\n                        var param = pConfigUpdate.AddMandatoryParameter(\"var=value\", \"assign value to var\");\n                        pConfigUpdate.OnCmdlineMatch(() =\u003e\n                        {\n                            System.Console.WriteLine($\"setting [{(string)param}]\");\n                        });\n                    });\n                });\n\n                // standard --help variant\n                parser.AddShortLong(\"h\", \"help\", \"show usage\", null, (item) =\u003e item.MatchParser.PrintUsage());\n\n                parser.Run(args);\n            });\n        }\n    }\n}\n```\n\n![](data/images/quickstart-04.gif)\n\n## API Documentation\n\n- [API](https://devel0.github.io/netcore-cmdline/api)\n\n## how this project was built\n \n```sh\nmkdir netcore-cmdline\ncd netcore-cmdline\n\ndotnet new sln\n\ndotnet new classlib -n netcore-cmdline\ncd netcore-cmdline\ndotnet add package netcore-util\ncd ..\ndotnet sln add netcore-cmdline\n\nmkdir examples\ncd examples\ndotnet new console -n example-01\ncd example-01\ndotnet add reference ../../netcore-cmdline\ncd ..\ncd ..\ndotnet sln add examples/example-01\n\ndotnet restore\ndotnet build\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevel0%2Fnetcore-cmdline","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevel0%2Fnetcore-cmdline","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevel0%2Fnetcore-cmdline/lists"}