/// <summary> /// Writes formatted usage information. /// </summary> /// <param name="options"> /// The <see cref="OptionSet"/> to write usage information for. /// </param> /// <exception cref="NotSupportedException"> /// An option has an unsupported <see cref="OptionValueType"/>. /// </exception> private void WriteUsage(OptionSet options) { using (var indentedTextWriter = new IndentedTextWriter(OutWriter, " ")) { indentedTextWriter.WriteLine(); indentedTextWriter.WriteLine($"Usage: {EntryAssemblyFileName} [options]"); indentedTextWriter.WriteLine(); indentedTextWriter.WriteLine("options:"); indentedTextWriter.Indent++; var maxPrototypeLength = options.Max(option => { switch (option.OptionValueType) { case OptionValueType.None: return(option.Prototype.Length); case OptionValueType.Optional: return(option.Prototype.Length - 1 + "[=VALUE]".Length); case OptionValueType.Required: return(option.Prototype.Length + "VALUE".Length); default: throw new NotSupportedException($"Unknown {nameof(OptionValueType)}: '{option.OptionValueType}'."); } }); foreach (var option in options) { switch (option.OptionValueType) { case OptionValueType.None: indentedTextWriter.WriteLine($"--{{0,-{maxPrototypeLength}}} {option.Description}", option.Prototype); break; case OptionValueType.Optional: indentedTextWriter.WriteLine($"--{{0,-{maxPrototypeLength}}} {option.Description}", option.Prototype.TrimEnd(':') + "[=VALUE]"); break; case OptionValueType.Required: indentedTextWriter.WriteLine($"--{{0,-{maxPrototypeLength}}} {option.Description}", option.Prototype + "VALUE"); break; } } indentedTextWriter.Indent--; } }