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."); }
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; } }
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(); }
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(); }
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(); }
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(); }