Ejemplo n.º 1
0
        private bool GenerateArgSpec(IDevCommand command)
        {
            command.HelpTextFull = command.Name + " - " + command.HelpTextBrief + "\n";

            command.Arguments.Clear();
            command.Options.Clear();

            // NOTE:  Unfortunately, Microsoft says the order of members returned by "GetMembers" is indeterminate:  https://msdn.microsoft.com/en-us/library/424c79hc(v=vs.110).aspx
            // Currently I depend on the order they appear in the source file for 'order of arguments', at least for making optional arguments appear after IsRequired arguments.
            // potential solution:  Sort by 'IsRequired'.
            var argMembers = command.GetType()
                             .GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                             .Where(e => Attribute.IsDefined(e, typeof(DevCommandArgumentAttribute)));

            foreach (var m in argMembers)
            {
                if (m is PropertyInfo)
                {
                    var propertyInfo = m as PropertyInfo;
                    var argInstance  = propertyInfo.GetValue(command, null) as Argument;
                    command.Arguments.Add(argInstance);

                    command.HelpTextFull += "   " + (argInstance.IsRequired ? "" : "[") + ArgumentTextDescription(argInstance);
                    command.HelpTextFull += (argInstance.IsRequired ? "" : "]") + "\n";

                    if (argInstance.HelpText.Length > 0)
                    {
                        command.HelpTextFull += "    " + argInstance.HelpText + "\n";
                    }
                }
                else
                {
                    Debug.Log("Member found, not Property but " + m.MemberType + ": " + m.Name);
                    return(false);
                }
            }

            var optionMembers = command.GetType()
                                .GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                                .Where(e => Attribute.IsDefined(e, typeof(DevCommandOptionAttribute)));

            foreach (var m in optionMembers)
            {
                if (m is PropertyInfo)
                {
                    var propertyInfo   = m as PropertyInfo;
                    var optionInstance = propertyInfo.GetValue(command, null) as Option;
                    command.Options.Add(optionInstance);

                    command.HelpTextFull += "   -" + optionInstance.Name;

                    foreach (var optionArg in optionInstance.Arguments)
                    {
                        command.HelpTextFull += " " + (optionArg.IsRequired ? "" : "[") + ArgumentTextDescription(optionArg);
                        command.HelpTextFull += (optionArg.IsRequired ? "" : "]");
                    }
                    command.HelpTextFull += "\n";

                    if (optionInstance.HelpText.Length > 0)
                    {
                        command.HelpTextFull += "      " + optionInstance.HelpText + "\n";
                    }

                    foreach (var optionArg in optionInstance.Arguments)
                    {
                        if (optionArg.HelpText.Length > 0)
                        {
                            command.HelpTextFull += "      Note on " + optionArg.Name + ": " + optionArg.HelpText + "\n";
                        }
                    }
                }
                else
                {
                    Debug.Log("Member found, not Property but " + m.MemberType + ": " + m.Name);
                    return(false);
                }
            }

            return(true);
        }