public string BuildHelpMessage(CommandHelpDefinition definition, bool showCommandName)
        {
            var sb = new StringBuilder();

            sb.AppendLine(BuildUsageMessage(definition, showCommandName));
            sb.AppendLine();

            if (!string.IsNullOrEmpty(definition.Description))
            {
                sb.AppendLine(definition.Description);
                sb.AppendLine();
            }

            if (definition.Options.Any())
            {
                sb.Append(BuildArgumentsMessage(definition));
                sb.Append(BuildOptionsMessage(definition));
            }
            else
            {
                sb.AppendLine("Options:");
                sb.AppendLine("  ()");
                sb.AppendLine();
            }

            return(sb.ToString());
        }
        public string BuildOptionsMessage(CommandHelpDefinition definition)
        {
            var optionsFormatted = definition.Options
                                   .Where(x => !x.Index.HasValue)
                                   .Select(x => (Options: string.Join(", ", x.Options) + (x.IsFlag ? string.Empty : $" {x.FormattedValueTypeName}"), x.Description, x.IsRequired, x.IsFlag, x.DefaultValue))
                                   .ToArray();

            if (!optionsFormatted.Any())
            {
                return(string.Empty);
            }

            var maxWidth = optionsFormatted.Max(x => x.Options.Length);

            var sb = new StringBuilder();

            sb.AppendLine("Options:");
            foreach (var opt in optionsFormatted)
            {
                var options = opt.Options;
                var padding = maxWidth - options.Length;

                sb.Append("  ");
                sb.Append(options);
                for (var i = 0; i < padding; i++)
                {
                    sb.Append(' ');
                }

                sb.Append("    ");
                sb.Append(opt.Description);

                if (opt.IsFlag)
                {
                    sb.Append($" (Optional)");
                }
                else if (opt.DefaultValue != null)
                {
                    sb.Append($" (Default: {opt.DefaultValue})");
                }
                else if (opt.IsRequired)
                {
                    sb.Append($" (Required)");
                }

                sb.AppendLine();
            }

            sb.AppendLine();

            return(sb.ToString());
        }
        public string BuildUsageMessage(CommandHelpDefinition definition, bool showCommandName)
        {
            var sb = new StringBuilder();

            sb.Append($"Usage: {GetExecutionCommandName()}");

            if (showCommandName)
            {
                sb.Append($" {(definition.CommandAliases.Any() ? definition.CommandAliases[0] : definition.Command)}");
            }

            foreach (var opt in definition.Options.Where(x => x.Index.HasValue))
            {
                sb.Append($" <{(string.IsNullOrEmpty(opt.Description) ? opt.Options[0] : opt.Description)}>");
            }

            if (definition.Options.Any(x => !x.Index.HasValue))
            {
                sb.Append(" [options...]");
            }

            return(sb.ToString());
        }
        public string BuildArgumentsMessage(CommandHelpDefinition definition)
        {
            var argumentsFormatted = definition.Options
                                     .Where(x => x.Index.HasValue)
                                     .Select(x => (Argument: $"[{x.Index}] <{x.ValueTypeName}>", x.Description, x.IsRequired, x.DefaultValue))
                                     .ToArray();

            if (!argumentsFormatted.Any())
            {
                return(string.Empty);
            }

            var maxWidth = argumentsFormatted.Max(x => x.Argument.Length);

            var sb = new StringBuilder();

            sb.AppendLine("Arguments:");
            foreach (var arg in argumentsFormatted)
            {
                var padding = maxWidth - arg.Argument.Length;

                sb.Append("  ");
                sb.Append(arg.Argument);
                for (var i = 0; i < padding; i++)
                {
                    sb.Append(' ');
                }

                sb.Append("    ");
                sb.AppendLine(arg.Description);
            }

            sb.AppendLine();

            return(sb.ToString());
        }