Esempio n. 1
0
        public void Draw(CommandLineWriter writer)
        {
            List <IOption>   options   = new List <IOption>();
            List <IArgument> arguments = new List <IArgument>();

            foreach (var(methodSpecs, _, _) in mMethods)
            {
                options.AddRange(methodSpecs.Options);
                arguments.AddRange(methodSpecs.Arguments);
            }

            _DrawUseage(options, arguments, writer);

            if (Desc != null)
            {
                writer.WriteLine();
                writer.WriteLine(Desc);
            }

            int           minLength            = 0;
            List <string> optionExplainHeads   = new();
            List <string> argumentExplainHeads = new();

            foreach (var option in options)
            {
                var head = option.GetDrawExplainHead();
                if (head.Length > minLength)
                {
                    minLength = head.Length;
                }
                optionExplainHeads.Add(head);
            }
            foreach (var argument in arguments)
            {
                var head = argument.GetDrawExplainHead();
                if (head.Length > minLength)
                {
                    minLength = head.Length;
                }
                argumentExplainHeads.Add(head);
            }
            foreach (var command in Subcommands)
            {
                if (command.Name.Length > minLength)
                {
                    minLength = command.Name.Length;
                }
            }

            _DrawOptions(options, optionExplainHeads, writer, minLength);
            _DrawArguments(arguments, argumentExplainHeads, writer, minLength);
            _DrawSubcommands(writer, minLength);

            writer.WriteLine();
            writer.WriteLine($"See '{Name} help <subcommand>' to read about a specific subcommand.");
        }
Esempio n. 2
0
        private static void _WriteDesc(CommandLineWriter writer, string?desc)
        {
            if (desc != null)
            {
                var oldLevel = writer.IndentLevel;
                writer.IndentLevel = writer.CurCharCount;

                writer.Write(desc, true);

                writer.IndentLevel = oldLevel;
            }
        }
Esempio n. 3
0
        private void _DrawSubcommands(CommandLineWriter writer, int minLength)
        {
            if (mGroup2Subcommands.Count <= 0)
            {
                return;
            }

            writer.WriteLine();
            writer.WriteLine("Available subcommands");
            writer.IncreaseIndent();

            foreach (var group in mGroups)
            {
                if (mGroups.Count > 1)
                {
                    writer.WriteLine(group);
                    writer.IncreaseIndent();
                }

                var commands = mGroup2Subcommands[group];
                foreach (var(command, _) in commands)
                {
                    var head = _FillHead(minLength, command.Name);

                    writer.Write(head);
                    _WriteDesc(writer, command.Desc);

                    writer.WriteLine();
                }

                if (mGroups.Count > 1)
                {
                    writer.DecreaseIndent();
                }
            }

            writer.DecreaseIndent();
        }
Esempio n. 4
0
        private void _DrawArguments(IReadOnlyList <IArgument> arguments, IReadOnlyList <string> explainHeads, CommandLineWriter writer, int minLength)
        {
            if (arguments.Count <= 0)
            {
                return;
            }

            writer.WriteLine();
            writer.WriteLine("Available args");
            writer.IncreaseIndent();

            for (var i = 0; i < arguments.Count; ++i)
            {
                var argument = arguments[i];
                var head     = explainHeads[i];

                head = _FillHead(minLength, head);

                writer.Write(head);
                _WriteDesc(writer, argument.Desc);

                writer.WriteLine();
            }

            writer.DecreaseIndent();
        }
Esempio n. 5
0
        private void _DrawOptions(IReadOnlyList <IOption> options, IReadOnlyList <string> explainHeads, CommandLineWriter writer, int minLength)
        {
            if (options.Count <= 0)
            {
                return;
            }

            writer.WriteLine();
            writer.WriteLine("Available options");
            writer.IncreaseIndent();

            for (int i = 0; i < options.Count; ++i)
            {
                var option = options[i];
                var head   = explainHeads[i];

                head = _FillHead(minLength, head);

                writer.Write(head);
                _WriteDesc(writer, option.Desc);

                writer.WriteLine();
            }

            writer.DecreaseIndent();
        }
Esempio n. 6
0
        private void _DrawUseage(IEnumerable <IOption> options, IEnumerable <IArgument> arguments, CommandLineWriter writer)
        {
            var head = $"usage: {Name}";

            writer.Write(head);
            writer.IndentLevel = $"{head} ".Length;

            // draw options
            foreach (var option in options)
            {
                writer.Write($" {option.GetDrawUsageHead()}");
            }

            var anySubcommand = Subcommands.Any();

            if (arguments.Any() || anySubcommand)
            {
                writer.Write(" [--]");
            }

            // draw arguments
            foreach (var argument in arguments)
            {
                writer.Write($" {argument.GetDrawUsageHead()}");
            }

            if (anySubcommand)
            {
                writer.Write($" <subcommand> [sub-options] [sub-args]");
            }

            writer.IndentLevel = 0;
            writer.WriteLine();
        }