| File: Commands\CommandLineUtils.cs | Web Access |
| Project: src\sdk\src\Cli\Microsoft.TemplateEngine.Cli\Microsoft.TemplateEngine.Cli.csproj (Microsoft.TemplateEngine.Cli) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.CommandLine; namespace Microsoft.TemplateEngine.Cli.Commands { internal class CommandLineUtils { // This code is from System.CommandLine, HelpBuilder class. // Ideally those methods are exposed, we may switch to use them. internal static string FormatArgumentUsage(IReadOnlyList<Argument> arguments) { var sb = new StringBuilder(); var end = default(Stack<char>); for (var i = 0; i < arguments.Count; i++) { var argument = arguments[i]; if (argument.Hidden) { continue; } var arityIndicator = argument.Arity.MaximumNumberOfValues > 1 ? "..." : ""; var isOptional = IsOptional(argument); if (isOptional) { sb.Append($"[<{argument.Name}>{arityIndicator}"); (end ??= new Stack<char>()).Push(']'); } else { sb.Append($"<{argument.Name}>{arityIndicator}"); } sb.Append(' '); } if (sb.Length > 0) { sb.Length--; if (end is { }) { while (end.Count > 0) { sb.Append(end.Pop()); } } } return sb.ToString(); bool IsMultiParented(Argument argument) => argument.Parents.Count() > 1; bool IsOptional(Argument argument) => IsMultiParented(argument) || argument.Arity.MinimumNumberOfValues == 0; } internal static string FormatArgumentUsage(Argument argument) => FormatArgumentUsage(new[] { argument }); internal static string FormatArgumentUsage(Option option) => FormatArgumentUsage(new[] { option }); // separate instance as Option.Argument is internal. internal static string FormatArgumentUsage(IReadOnlyList<Option> options) { var sb = new StringBuilder(); var end = default(Stack<char>); for (var i = 0; i < options.Count; i++) { var option = options[i]; if (option.Hidden) { continue; } var arityIndicator = option.Arity.MaximumNumberOfValues > 1 ? "..." : ""; var isOptional = IsOptional(option); if (isOptional) { sb.Append($"[<{option.Name}>{arityIndicator}"); (end ??= new Stack<char>()).Push(']'); } else { sb.Append($"<{option.Name}>{arityIndicator}"); } sb.Append(' '); } if (sb.Length > 0) { sb.Length--; if (end is { }) { while (end.Count > 0) { sb.Append(end.Pop()); } } } return sb.ToString(); bool IsMultiParented(Option option) => option.Parents.Count() > 1; bool IsOptional(Option option) => IsMultiParented(option) || option.Arity.MinimumNumberOfValues == 0; } } }