public static Options CreateFromType(Type type) { if (type == null) { throw new ArgumentNullException("type"); } //if (!Attribute.IsDefined(type, typeof(OptionsAttribute))) // throw new ArgumentException("The type '" + type + "' is not marked as options"); MemberInfo[] members = type.FindMembers(MemberTypes.Field | MemberTypes.Property, BindingFlags.Public | BindingFlags.Instance, FilterMember, null); var groups = new Dictionary <string, OptionGroup>(); var requiredGroups = new List <string>(); Attribute[] groupsAttrs = Attribute.GetCustomAttributes(type, typeof(OptionGroupAttribute)); foreach (OptionGroupAttribute groupAttr in groupsAttrs) { OptionGroup group; if (!groups.TryGetValue(groupAttr.Name, out @group)) { @group = new OptionGroup { IsRequired = groupAttr.IsRequired }; groups[groupAttr.Name] = @group; if (groupAttr.IsRequired) { requiredGroups.Add(groupAttr.Name); } } } var options = new Options(); foreach (MemberInfo member in members) { Option option = CreateOptionFromMember(member, groups); if (option != null) { options.AddOption(option); } } foreach (var entry in groups) { var group = entry.Value; options.AddOptionGroup(group); } return(options); }
private static Option CreateOptionFromMember(MemberInfo member, IDictionary <string, OptionGroup> groups) { var attribute = (OptionAttribute)Attribute.GetCustomAttribute(member, typeof(OptionAttribute)); string optionName = null; string optionLongName = null; if (attribute != null) { optionLongName = attribute.LongName; optionName = attribute.Name; } if (String.IsNullOrEmpty(optionName)) { optionName = member.Name[0].ToString(CultureInfo.InvariantCulture); } if (String.IsNullOrEmpty(optionLongName)) { optionLongName = member.Name; } var desc = attribute != null ? attribute.Description : null; var option = new Option(optionName, desc) { LongName = optionLongName, ArgumentCount = attribute != null ? attribute.ArgumentCount : 0, IsRequired = attribute != null && attribute.IsRequired, ArgumentName = attribute != null ? attribute.ArgumentName : "arg", ValueSeparator = attribute != null ? attribute.ValueSeparator : ' ', HasOptionalArgument = attribute != null && attribute.HasOptionalArgument }; var groupAttr = (OptionGroupAttribute)Attribute.GetCustomAttribute(member, typeof(OptionGroupAttribute)); if (groupAttr != null) { OptionGroup group; if (!groups.TryGetValue(groupAttr.Name, out group)) { group = new OptionGroup(); groups[groupAttr.Name] = group; } group.AddOption(option); return(null); } return(option); }
public void PrintOptionGroupUsage() { OptionGroup group = new OptionGroup(); group.AddOption(OptionBuilder.New().Create("a")); group.AddOption(OptionBuilder.New().Create("b")); group.AddOption(OptionBuilder.New().Create("c")); Options options = new Options(); options.AddOptionGroup(group); StringWriter output = new StringWriter(); HelpFormatter formatter = new HelpFormatter(); formatter.PrintUsage(options, new HelpSettings { Width = 80, CommandLineSyntax = "app" }, output); Assert.AreEqual("usage: app [-a | -b | -c]" + Eol, output.ToString()); }
public Options AddOptionGroup(OptionGroup group) { if (group.IsRequired) { foreach (var option in group.Options) { requiredOpts.Add(option.Key()); } } foreach (var opt in group.Options) { var option = (Option)opt; // an Option cannot be required if it is in an // OptionGroup, either the group is required or // nothing is required option.IsRequired = false; AddOption(option); optionGroups[option.Key()] = group; } return(this); }