Exemple #1
0
        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);
        }
Exemple #2
0
        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());
        }
Exemple #4
0
        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);
        }