/// <summary> /// Creates a new instance of the <see cref="CommandLine.Text.HelpText"/> class using common defaults. /// </summary> /// <returns> /// An instance of <see cref="CommandLine.Text.HelpText"/> class. /// </returns> /// <param name='parserResult'>The <see cref="CommandLine.ParserResult{T}"/> containing the instance that collected command line arguments parsed with <see cref="CommandLine.Parser"/> class.</param> /// <param name='onError'>A delegate used to customize the text block of reporting parsing errors text block.</param> /// <param name='onExample'>A delegate used to customize <see cref="CommandLine.Text.Example"/> model used to render text block of usage examples.</param> /// <param name="verbsIndex">If true the output style is consistent with verb commands (no dashes), otherwise it outputs options.</param> /// <remarks>The parameter <paramref name="verbsIndex"/> is not ontly a metter of formatting, it controls whether to handle verbs or options.</remarks> public static HelpText AutoBuild <T>( ParserResult <T> parserResult, Func <HelpText, HelpText> onError, Func <Example, Example> onExample, bool verbsIndex = false) { var auto = new HelpText { Heading = HeadingInfo.Default, Copyright = CopyrightInfo.Default, AdditionalNewLineAfterOption = true, AddDashesToOption = !verbsIndex }; var errors = Enumerable.Empty <Error>(); if (onError != null && parserResult.Tag == ParserResultType.NotParsed) { errors = ((NotParsed <T>)parserResult).Errors; if (errors.OnlyMeaningfulOnes().Any()) { auto = onError(auto); } } ReflectionHelper.GetAttribute <AssemblyLicenseAttribute>() .Do(license => license.AddToHelpText(auto, true)); var usageAttr = ReflectionHelper.GetAttribute <AssemblyUsageAttribute>(); var usageLines = HelpText.RenderUsageTextAsLines(parserResult, onExample).ToMaybe(); if (usageAttr.IsJust() || usageLines.IsJust()) { var heading = auto.SentenceBuilder.UsageHeadingText(); if (heading.Length > 0) { auto.AddPreOptionsLine(heading); } } usageAttr.Do( usage => usage.AddToHelpText(auto, true)); usageLines.Do( lines => auto.AddPreOptionsLines(lines)); if ((verbsIndex && parserResult.TypeInfo.Choices.Any()) || errors.Any(e => e.Tag == ErrorType.NoVerbSelectedError)) { auto.AddDashesToOption = false; auto.AddVerbs(parserResult.TypeInfo.Choices.ToArray()); } else { auto.AddOptions(parserResult); } return(auto); }