Skip to content

Latest commit

 

History

History
65 lines (60 loc) · 2.91 KB

README.md

File metadata and controls

65 lines (60 loc) · 2.91 KB

Command line parser

Easy to use command line parser.

To use just copy file CommandLine.cs to your project. Then create a parser and call Parse method with array of arguments. Check the returned error string. If it's null there is no errors. Here is the sample code:

namespace CommandLineSample {
    internal class Program {
        // /?
        // /n Mercury Venus Mars
        // /v /n Mercury Venus Mars "Planets of the Solar system"
        [SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters")]
        static void Main(string[] args) {
            bool verbose = false;
            bool printHelp = false;
            List<string> names = new List<string>();
            int count = 1;
            CommandLine commandLine = new CommandLine()
                .AddString("n", null, "<Name>", "name of someone to greet", true, l => names.Add(l))
                .AddInt("count", "c", "<Count>", "number of times to repeat greetings", false, 1, 10, i => count = i)
                .AddFlag("verbose", "v", "verbose debug output", false, v => verbose = v)
                .AddFlag("help", "?", "print command usage", false, h => printHelp = h)
            ;
            string? error = commandLine.Parse(args, l => names.AddRange(l));
            if(printHelp) {
                Usage(commandLine.Help());
                return;
            }
            if(error != null) {
                string appName = Process.GetCurrentProcess().ProcessName;
                Console.WriteLine("{0}: {1}", appName, error);
                Console.WriteLine("For more information run {0} /?", appName);
                return;
            }
            Greet(verbose, names, count);
        }

        [SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters")]
        private static void Usage(string help) {
            string appName = Process.GetCurrentProcess().ProcessName;
            Console.WriteLine("{0} - greeting application", appName);
            Console.WriteLine("usage: {0} OPTIONS [Other names]", appName);
            Console.WriteLine("Greets people in the provided list");
            Console.WriteLine();
            Console.WriteLine("OPTIONS:");
            Console.WriteLine(help);
        }

        [SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters")]
        private static void Greet(bool verbose, List<string> names, int count) {
            if(verbose) {
                Console.WriteLine("Printing greetings for {0} persons in verbose mode, repeating {1} time{2}", names.Count, count, (1 < count) ? "s" : string.Empty);
            }
            foreach(string name in names) {
                for(int i = 0; i < count; i++) {
                    Console.WriteLine("Hello {0}", name);
                }
            }
        }
    }
}