Beispiel #1
0
        public void Write(
            RootSchema root,
            CommandSchema command,
            IReadOnlyDictionary <CommandArgumentSchema, object?> defaultValues)
        {
            var childCommands = root.GetChildCommands(command.Name);

            _console.ResetColor();

            if (command.IsDefault)
            {
                WriteApplicationInfo();
            }

            WriteCommandDescription(command);
            WriteCommandUsage(command, childCommands);
            WriteCommandParameters(command);
            WriteCommandOptions(command, defaultValues);
            WriteCommandChildren(command, childCommands);
        }
Beispiel #2
0
        private void WriteCommandParameters(CommandSchema command)
        {
            if (!command.Parameters.Any())
            {
                return;
            }

            if (!IsEmpty)
            {
                WriteVerticalMargin();
            }

            WriteHeader("Parameters");

            foreach (var parameter in command.Parameters.OrderBy(p => p.Order))
            {
                Write(ConsoleColor.Red, "* ");
                Write(ConsoleColor.White, $"{parameter.Name}");

                WriteColumnMargin();

                // Description
                if (!string.IsNullOrWhiteSpace(parameter.Description))
                {
                    Write(parameter.Description);
                    Write(' ');
                }

                // Valid values
                var validValues = parameter.GetValidValues();
                if (validValues.Any())
                {
                    Write($"Valid values: {FormatValidValues(validValues)}.");
                }

                WriteLine();
            }
        }
Beispiel #3
0
        private void WriteCommandOptions(
            CommandSchema command,
            IReadOnlyDictionary <CommandArgumentSchema, object?> argumentDefaultValues)
        {
            if (!IsEmpty)
            {
                WriteVerticalMargin();
            }

            WriteHeader("Options");

            foreach (var option in command.Options.OrderByDescending(o => o.IsRequired))
            {
                if (option.IsRequired)
                {
                    Write(ConsoleColor.Red, "* ");
                }
                else
                {
                    WriteHorizontalMargin();
                }

                // Short name
                if (option.ShortName != null)
                {
                    Write(ConsoleColor.White, $"-{option.ShortName}");
                }

                // Separator
                if (!string.IsNullOrWhiteSpace(option.Name) && option.ShortName != null)
                {
                    Write('|');
                }

                // Name
                if (!string.IsNullOrWhiteSpace(option.Name))
                {
                    Write(ConsoleColor.White, $"--{option.Name}");
                }

                WriteColumnMargin();

                // Description
                if (!string.IsNullOrWhiteSpace(option.Description))
                {
                    Write(option.Description);
                    Write(' ');
                }

                // Valid values
                var validValues = option.GetValidValues();
                if (validValues.Any())
                {
                    Write($"Valid values: {FormatValidValues(validValues)}.");
                    Write(' ');
                }

                // Environment variable
                if (!string.IsNullOrWhiteSpace(option.EnvironmentVariableName))
                {
                    Write($"Environment variable: \"{option.EnvironmentVariableName}\".");
                    Write(' ');
                }

                // Default value
                if (!option.IsRequired)
                {
                    var defaultValue          = argumentDefaultValues.GetValueOrDefault(option);
                    var defaultValueFormatted = FormatDefaultValue(defaultValue);
                    if (defaultValueFormatted != null)
                    {
                        Write($"Default: {defaultValueFormatted}.");
                    }
                }

                WriteLine();
            }
        }
Beispiel #4
0
        public void Write(ApplicationSchema applicationSchema, CommandSchema command)
        {
            var column = 0;
            var row    = 0;

            var childCommands = applicationSchema.GetChildCommands(command.Name);

            bool IsEmpty() => column == 0 && row == 0;

            void Render(string text)
            {
                _console.Output.Write(text);

                column += text.Length;
            }

            void RenderNewLine()
            {
                _console.Output.WriteLine();

                column = 0;
                row++;
            }

            void RenderMargin(int lines = 1)
            {
                if (!IsEmpty())
                {
                    for (var i = 0; i < lines; i++)
                    {
                        RenderNewLine();
                    }
                }
            }

            void RenderIndent(int spaces = 2)
            {
                Render(' '.Repeat(spaces));
            }

            void RenderColumnIndent(int spaces = 20, int margin = 2)
            {
                if (column + margin < spaces)
                {
                    RenderIndent(spaces - column);
                }
                else
                {
                    Render(" ");
                }
            }

            void RenderWithColor(string text, ConsoleColor foregroundColor)
            {
                _console.WithForegroundColor(foregroundColor, () => Render(text));
            }

            void RenderHeader(string text)
            {
                RenderWithColor(text, ConsoleColor.Magenta);
                RenderNewLine();
            }

            void RenderApplicationInfo()
            {
                if (!command.IsDefault)
                {
                    return;
                }

                // Title and version
                RenderWithColor(_metadata.Title, ConsoleColor.Yellow);
                Render(" ");
                RenderWithColor(_metadata.VersionText, ConsoleColor.Yellow);
                RenderNewLine();

                // Description
                if (!string.IsNullOrWhiteSpace(_metadata.Description))
                {
                    Render(_metadata.Description);
                    RenderNewLine();
                }
            }

            void RenderDescription()
            {
                if (string.IsNullOrWhiteSpace(command.Description))
                {
                    return;
                }

                RenderMargin();
                RenderHeader("Description");

                RenderIndent();
                Render(command.Description);
                RenderNewLine();
            }

            void RenderUsage()
            {
                RenderMargin();
                RenderHeader("Usage");

                // Exe name
                RenderIndent();
                Render(_metadata.ExecutableName);

                // Command name
                if (!string.IsNullOrWhiteSpace(command.Name))
                {
                    Render(" ");
                    RenderWithColor(command.Name, ConsoleColor.Cyan);
                }

                // Child command placeholder
                if (childCommands.Any())
                {
                    Render(" ");
                    RenderWithColor("[command]", ConsoleColor.Cyan);
                }

                // Parameters
                foreach (var parameter in command.Parameters)
                {
                    Render(" ");
                    Render(parameter.IsScalar
                        ? $"<{parameter.DisplayName}>"
                        : $"<{parameter.DisplayName}...>");
                }

                // Required options
                var requiredOptionSchemas = command.Options
                                            .Where(o => o.IsRequired)
                                            .ToArray();

                foreach (var option in requiredOptionSchemas)
                {
                    Render(" ");
                    if (!string.IsNullOrWhiteSpace(option.Name))
                    {
                        RenderWithColor($"--{option.Name}", ConsoleColor.White);
                        Render(" ");
                        Render(option.IsScalar
                            ? "<value>"
                            : "<values...>");
                    }
                    else
                    {
                        RenderWithColor($"-{option.ShortName}", ConsoleColor.White);
                        Render(" ");
                        Render(option.IsScalar
                            ? "<value>"
                            : "<values...>");
                    }
                }

                // Options placeholder
                if (command.Options.Count != requiredOptionSchemas.Length)
                {
                    Render(" ");
                    RenderWithColor("[options]", ConsoleColor.White);
                }

                RenderNewLine();
            }

            void RenderParameters()
            {
                if (!command.Parameters.Any())
                {
                    return;
                }

                RenderMargin();
                RenderHeader("Parameters");

                var parameters = command.Parameters
                                 .OrderBy(p => p.Order)
                                 .ToArray();

                foreach (var parameter in parameters)
                {
                    RenderWithColor("* ", ConsoleColor.Red);
                    RenderWithColor($"{parameter.DisplayName}", ConsoleColor.White);

                    RenderColumnIndent();

                    // Description
                    if (!string.IsNullOrWhiteSpace(parameter.Description))
                    {
                        Render(parameter.Description);
                    }

                    RenderNewLine();
                }
            }

            void RenderOptions()
            {
                RenderMargin();
                RenderHeader("Options");

                var options = command.Options
                              .OrderByDescending(o => o.IsRequired)
                              .ToList();

                // Add built-in options
                options.Add(CommandOptionSchema.HelpOption);
                if (command.IsDefault)
                {
                    options.Add(CommandOptionSchema.VersionOption);
                }

                foreach (var option in options)
                {
                    if (option.IsRequired)
                    {
                        RenderWithColor("* ", ConsoleColor.Red);
                    }
                    else
                    {
                        RenderIndent();
                    }

                    // Short name
                    if (option.ShortName != null)
                    {
                        RenderWithColor($"-{option.ShortName}", ConsoleColor.White);
                    }

                    // Delimiter
                    if (!string.IsNullOrWhiteSpace(option.Name) && option.ShortName != null)
                    {
                        Render("|");
                    }

                    // Name
                    if (!string.IsNullOrWhiteSpace(option.Name))
                    {
                        RenderWithColor($"--{option.Name}", ConsoleColor.White);
                    }

                    RenderColumnIndent();

                    // Description
                    if (!string.IsNullOrWhiteSpace(option.Description))
                    {
                        Render(option.Description);
                        Render(" ");
                    }

                    // Environment variable
                    if (!string.IsNullOrWhiteSpace(option.EnvironmentVariableName))
                    {
                        Render($"(Environment variable: {option.EnvironmentVariableName}).");
                        Render(" ");
                    }

                    RenderNewLine();
                }
            }

            void RenderChildCommands()
            {
                if (!childCommands.Any())
                {
                    return;
                }

                RenderMargin();
                RenderHeader("Commands");

                foreach (var childCommand in childCommands)
                {
                    var relativeCommandName =
                        !string.IsNullOrWhiteSpace(command.Name)
                            ? childCommand.Name !.Substring(command.Name.Length + 1)
                            : childCommand.Name !;

                    // Name
                    RenderIndent();
                    RenderWithColor(relativeCommandName, ConsoleColor.Cyan);

                    // Description
                    if (!string.IsNullOrWhiteSpace(childCommand.Description))
                    {
                        RenderColumnIndent();
                        Render(childCommand.Description);
                    }

                    RenderNewLine();
                }

                RenderMargin();

                // Child command help tip
                Render("You can run `");
                Render(_metadata.ExecutableName);

                if (!string.IsNullOrWhiteSpace(command.Name))
                {
                    Render(" ");
                    RenderWithColor(command.Name, ConsoleColor.Cyan);
                }

                Render(" ");
                RenderWithColor("[command]", ConsoleColor.Cyan);

                Render(" ");
                RenderWithColor("--help", ConsoleColor.White);

                Render("` to show help on a specific command.");

                RenderNewLine();
            }

            _console.ResetColor();
            RenderApplicationInfo();
            RenderDescription();
            RenderUsage();
            RenderParameters();
            RenderOptions();
            RenderChildCommands();
        }