private static string GetCmdLineSwitch(MemberInfo memberInfo)
        {
            string cmdLineSwitch = null;
            ChoCommandLineArgAttribute commandLineArgumentAttribute = (ChoCommandLineArgAttribute)memberInfo.GetCustomAttribute <ChoCommandLineArgAttribute>(true);

            if (commandLineArgumentAttribute != null)
            {
                cmdLineSwitch = commandLineArgumentAttribute.CommandLineSwitch;
            }
            else
            {
                ChoPositionalCommandLineArgAttribute posCommandLineArgumentAttribute = (ChoPositionalCommandLineArgAttribute)memberInfo.GetCustomAttribute <ChoPositionalCommandLineArgAttribute>(true);
                if (posCommandLineArgumentAttribute != null)
                {
                    cmdLineSwitch = posCommandLineArgumentAttribute.ShortName;
                }
                if (cmdLineSwitch.IsNullOrWhiteSpace())
                {
                    cmdLineSwitch = posCommandLineArgumentAttribute.Position.ToString();
                }
            }

            return(cmdLineSwitch);
        }
Пример #2
0
        public virtual string GetUsage()
        {
            Type type = GetType();

            StringBuilder builder      = new StringBuilder();
            StringBuilder whereBuilder = new StringBuilder();

            ChoCommandLineParserSettings commandLineParserSettings = ChoCommandLineParserSettings.Me;
            char cmdLineValueSeparator = commandLineParserSettings.ValueSeparators != null && commandLineParserSettings.ValueSeparators.Length > 0 ? commandLineParserSettings.ValueSeparators[0] : ':';
            char cmdLineSwitchChar     = commandLineParserSettings.SwitchChars != null && commandLineParserSettings.SwitchChars.Length > 0 ? commandLineParserSettings.SwitchChars[0] : '-';

            builder.Append(Path.GetFileNameWithoutExtension(Assembly.GetEntryAssembly().Location).ToUpper());
            MemberInfo[] memberInfos = ChoTypeMembersCache.GetAllMemberInfos(type);

            if (memberInfos != null && memberInfos.Length > 0)
            {
                ChoCommandLineArgAttribute           commandLineArgumentAttribute   = null;
                ChoDefaultCommandLineArgAttribute    defaultCommandLineArgAttribute = null;
                ChoPositionalCommandLineArgAttribute posCommandLineArgAttribute     = null;

                List <Tuple <ChoDefaultCommandLineArgAttribute, MemberInfo> > memberList = new List <Tuple <ChoDefaultCommandLineArgAttribute, MemberInfo> >();
                foreach (MemberInfo memberInfo in memberInfos)
                {
                    commandLineArgumentAttribute   = null;
                    defaultCommandLineArgAttribute = null;

                    defaultCommandLineArgAttribute = commandLineArgumentAttribute = (ChoCommandLineArgAttribute)memberInfo.GetCustomAttribute <ChoCommandLineArgAttribute>(true);
                    if (commandLineArgumentAttribute == null)
                    {
                        defaultCommandLineArgAttribute = posCommandLineArgAttribute = (ChoPositionalCommandLineArgAttribute)memberInfo.GetCustomAttribute <ChoPositionalCommandLineArgAttribute>(true);
                        if (posCommandLineArgAttribute == null)
                        {
                            continue;
                        }
                    }

                    memberList.Add(new Tuple <ChoDefaultCommandLineArgAttribute, MemberInfo>(defaultCommandLineArgAttribute, memberInfo));
                }

                bool isEmptyShortName;

                memberList.Sort((x, y) =>
                                x.Item1.Order.CompareTo(y.Item1.Order));

                MemberInfo memberInfo1 = null;
                foreach (Tuple <ChoDefaultCommandLineArgAttribute, MemberInfo> tuple in memberList)
                {
                    memberInfo1 = tuple.Item2;

                    commandLineArgumentAttribute   = null;
                    defaultCommandLineArgAttribute = null;

                    defaultCommandLineArgAttribute = commandLineArgumentAttribute = (ChoCommandLineArgAttribute)memberInfo1.GetCustomAttribute <ChoCommandLineArgAttribute>(true);
                    if (commandLineArgumentAttribute == null)
                    {
                        defaultCommandLineArgAttribute = posCommandLineArgAttribute = (ChoPositionalCommandLineArgAttribute)memberInfo1.GetCustomAttribute <ChoPositionalCommandLineArgAttribute>(true);
                        if (posCommandLineArgAttribute == null)
                        {
                            continue;
                        }
                    }

                    isEmptyShortName = !defaultCommandLineArgAttribute.ShortName.IsNull() &&
                                       defaultCommandLineArgAttribute.ShortName.Length == 0;

                    if (!defaultCommandLineArgAttribute.IsRequired)
                    {
                        builder.Append(" [");
                    }
                    else
                    {
                        builder.Append(" ");
                    }

                    Type memberType = ChoType.GetMemberType(memberInfo1);
                    if (memberType.IsNullableType())
                    {
                        memberType = Nullable.GetUnderlyingType(memberType);
                    }

                    if (commandLineArgumentAttribute != null)
                    {
                        builder.Append("{0}{1}{2}".FormatString(cmdLineSwitchChar, commandLineArgumentAttribute.CommandLineSwitch, !isEmptyShortName ? cmdLineValueSeparator.ToString() : String.Empty));
                    }

                    string description = null;
                    if (commandLineArgumentAttribute != null)
                    {
                        description = commandLineArgumentAttribute.Description;
                    }
                    else if (posCommandLineArgAttribute != null)
                    {
                        description = posCommandLineArgAttribute.Description;
                    }
                    else
                    {
                        description = defaultCommandLineArgAttribute.Description;
                    }

                    if (_commandLineArgsObjectAttribute.GetDisplayDefaultValue())
                    {
                        string defaultValue = null;
                        defaultValue = GetDefaultValueText(memberInfo1);
                        if (defaultValue != null && memberType != typeof(bool))
                        {
                            description = "{0} [DEFAULT: {1}]".FormatString(description, defaultValue);
                        }
                    }

                    if (commandLineArgumentAttribute != null)
                    {
                        whereBuilder.AppendFormat("{1}{3}{2}{0}", Environment.NewLine, GetCmdLineSwitches(cmdLineSwitchChar, commandLineArgumentAttribute),
                                                  description.WrapLongLines(commandLineArgumentAttribute.DescriptionFormatLineSize, String.Empty,
                                                                            commandLineArgumentAttribute.DescriptionFormatLineBreakChar, commandLineArgumentAttribute.NoOfTabsSwitchDescFormatSeparator),
                                                  "\t".Repeat(commandLineArgumentAttribute.NoOfTabsSwitchDescFormatSeparator));
                    }
                    else if (posCommandLineArgAttribute != null)
                    {
                        whereBuilder.AppendFormat("{1}{3}{2}{0}", Environment.NewLine,
                                                  defaultCommandLineArgAttribute.ShortName.IsNull() ? "Position{0}".FormatString(posCommandLineArgAttribute.Position) : defaultCommandLineArgAttribute.ShortName,
                                                  description.WrapLongLines(posCommandLineArgAttribute.DescriptionFormatLineSize, String.Empty,
                                                                            posCommandLineArgAttribute.DescriptionFormatLineBreakChar, posCommandLineArgAttribute.NoOfTabsSwitchDescFormatSeparator),
                                                  "\t".Repeat(posCommandLineArgAttribute.NoOfTabsSwitchDescFormatSeparator));
                    }
                    else
                    {
                        whereBuilder.AppendFormat("{3}{2}{1}{0}", Environment.NewLine,
                                                  description.WrapLongLines(defaultCommandLineArgAttribute.DescriptionFormatLineSize, String.Empty,
                                                                            defaultCommandLineArgAttribute.DescriptionFormatLineBreakChar, defaultCommandLineArgAttribute.NoOfTabsSwitchDescFormatSeparator),
                                                  "\t".Repeat(defaultCommandLineArgAttribute.NoOfTabsSwitchDescFormatSeparator), DefaultCmdLineSwitch);
                    }

                    if (memberType == typeof(int))
                    {
                        if (!defaultCommandLineArgAttribute.ShortName.IsNull())
                        {
                            builder.Append(defaultCommandLineArgAttribute.ShortName);
                        }
                        else
                        {
                            builder.Append("<int>");
                        }
                    }
                    else if (memberType == typeof(uint))
                    {
                        if (!defaultCommandLineArgAttribute.ShortName.IsNull())
                        {
                            builder.Append(defaultCommandLineArgAttribute.ShortName);
                        }
                        else
                        {
                            builder.Append("<uint>");
                        }
                    }
                    else if (memberType == typeof(bool))
                    {
                        builder.Remove(builder.Length - 1, 1);
                    }
                    else if (memberType == typeof(string))
                    {
                        if (!defaultCommandLineArgAttribute.ShortName.IsNull())
                        {
                            builder.Append(defaultCommandLineArgAttribute.ShortName);
                        }
                        else
                        {
                            builder.Append("<string>");
                        }
                    }
                    else if (memberType.IsEnum)
                    {
                        //builder.Append("{0}{1}{2}".FormatString(cmdLineSwitchChar, commandLineArgumentAttribute.CommandLineSwitch, !isEmptyShortName ? cmdLineValueSeparator.ToString() : String.Empty));
                        builder.Append("{");
                        bool first = true;
                        foreach (FieldInfo field in memberType.GetFields())
                        {
                            if (field.IsStatic)
                            {
                                if (first)
                                {
                                    first = false;
                                }
                                else
                                {
                                    builder.Append(" | ");
                                }

                                builder.Append(field.Name);
                            }
                        }
                        builder.Append('}');
                    }
                    else
                    {
                        if (!defaultCommandLineArgAttribute.ShortName.IsNull())
                        {
                            builder.Append(defaultCommandLineArgAttribute.ShortName);
                        }
                        else
                        {
                            builder.Append("<Unknown>");
                        }
                    }

                    if (!defaultCommandLineArgAttribute.IsRequired)
                    {
                        builder.Append("]");
                    }
                }
            }

            if (!_commandLineArgsObjectAttribute.DoNotShowUsageDetail)
            {
                builder.Append(Environment.NewLine);
                builder.Append(Environment.NewLine);
                builder.Append(whereBuilder.ToString().Indent());
                builder.Append(Environment.NewLine);

                foreach (ChoCommandLineArgAdditionalUsageAttribute commandLineArgAdditionalUsageAttribute in ChoType.GetAttributes <ChoCommandLineArgAdditionalUsageAttribute>(type))
                {
                    if (commandLineArgAdditionalUsageAttribute != null && !commandLineArgAdditionalUsageAttribute.AdditionalUsageText.IsNull())
                    {
                        builder.Append(commandLineArgAdditionalUsageAttribute.AdditionalUsageText);

                        builder.Append(Environment.NewLine);
                        builder.Append(Environment.NewLine);
                    }
                }
            }
            return(builder.ToString());
        }
        //private static void AssignToDefaultValues(ChoCommandLineArgObject commandLineArgObject)
        //{
        //    object newCmdLineArgValue = null;

        //    string name = null;
        //    string defaultValue = null;
        //    bool isDefaultValueSpecified;
        //    MemberInfo[] memberInfos = ChoTypeMembersCache.GetAllMemberInfos(commandLineArgObject.GetType());
        //    if (memberInfos != null && memberInfos.Length > 0)
        //    {
        //        ChoCommandLineArgAttribute defaultCommandLineArgAttribute = null;
        //        foreach (MemberInfo memberInfo in memberInfos)
        //        {
        //            defaultCommandLineArgAttribute = (ChoCommandLineArgAttribute)ChoType.GetMemberAttribute(memberInfo, typeof(ChoCommandLineArgAttribute));
        //            if (defaultCommandLineArgAttribute == null) continue;

        //            name = ChoType.GetMemberName(memberInfo);
        //            defaultValue = null;
        //            if (ChoType.GetMemberType(memberInfo) == typeof(bool))
        //                continue;

        //            isDefaultValueSpecified = ChoCmdLineArgMetaDataManager.TryGetDefaultValue(commandLineArgObject, name, defaultCommandLineArgAttribute, out defaultValue);
        //            if (!isDefaultValueSpecified)
        //                continue;
        //            try
        //            {
        //                defaultValue = ChoString.ExpandPropertiesEx(defaultValue);
        //                object newConvertedValue = ChoConvert.ConvertFrom(defaultValue, memberInfo, commandLineArgObject);

        //                //object newConvertedValue = ChoConvert.ConvertFrom(commandLineArgObject, defaultValue, ChoType.GetMemberType(memberInfo),
        //                //    ChoTypeDescriptor.GetTypeConverters(memberInfo), ChoTypeDescriptor.GetTypeConverterParams(memberInfo));
        //                ChoType.SetMemberValue(commandLineArgObject, memberInfo, newCmdLineArgValue);
        //            }
        //            catch //(Exception ex)
        //            {
        //            }
        //        }
        //    }
        //}

        private static Exception ExtractNPopulateValue(ChoCommandLineArgObject commandLineArgObject, MemberInfo memberInfo, ChoCommandLineArgParser commandLineArgParser)
        {
            ChoDefaultCommandLineArgAttribute    defaultCommandLineArgAttribute = null;
            ChoCommandLineArgAttribute           commandLineArgumentAttribute   = null;
            ChoPositionalCommandLineArgAttribute posCommandLineArgAttribute     = null;

            if (ChoType.IsReadOnlyMember(memberInfo))
            {
                return(null);
            }

            commandLineArgumentAttribute = null;
            posCommandLineArgAttribute   = null;

            defaultCommandLineArgAttribute = commandLineArgumentAttribute = (ChoCommandLineArgAttribute)memberInfo.GetCustomAttribute <ChoCommandLineArgAttribute>(true);
            if (commandLineArgumentAttribute == null)
            {
                defaultCommandLineArgAttribute = posCommandLineArgAttribute = (ChoPositionalCommandLineArgAttribute)memberInfo.GetCustomAttribute <ChoPositionalCommandLineArgAttribute>(true);
                if (posCommandLineArgAttribute == null)
                {
                    return(null);
                }
            }

            bool   containsCmdLineArg       = false;
            string cmdLineArgValue          = null;
            object newCmdLineArgValue       = null;
            string defaultValue             = null;
            bool   isDefaultValueSpecified  = false;
            bool   isFallbackValueSpecified = false;
            string name             = null;
            string fallbackValue    = null;
            object fallbackValueObj = null;
            object defaultValueObj  = null;

            name = ChoType.GetMemberName(memberInfo);

            try
            {
                if (posCommandLineArgAttribute != null)
                {
                    if (!commandLineArgParser.IsSwitchSpecified(posCommandLineArgAttribute.Position))
                    {
                        commandLineArgObject.RaiseCommandLineArgNotFound(posCommandLineArgAttribute.Position.ToString(), ref cmdLineArgValue);
                    }
                    cmdLineArgValue = commandLineArgParser[posCommandLineArgAttribute.Position];
                }
                else if (commandLineArgumentAttribute != null)
                {
                    if (!commandLineArgParser.IsSwitchSpecified(commandLineArgumentAttribute.CommandLineSwitch))
                    {
                        commandLineArgObject.RaiseCommandLineArgNotFound(commandLineArgumentAttribute.CommandLineSwitch, ref cmdLineArgValue);
                    }

                    if (ChoType.GetMemberType(memberInfo) == typeof(bool))
                    {
                        containsCmdLineArg = IsSwitchSpecified(commandLineArgParser, commandLineArgumentAttribute.CommandLineSwitch, commandLineArgumentAttribute.Aliases);
                        if (containsCmdLineArg)
                        {
                            cmdLineArgValue = "True";
                            //cmdLineArgValue = GetCmdLineArgValue(commandLineArgParser, commandLineArgumentAttribute.CommandLineSwitch, commandLineArgumentAttribute.Aliases);
                            //if (cmdLineArgValue.IsNullOrWhiteSpace())
                            //    cmdLineArgValue = "True";
                        }
                        else
                        {
                            containsCmdLineArg = IsSwitchSpecified(commandLineArgParser, "{0}-".FormatString(commandLineArgumentAttribute.CommandLineSwitch), commandLineArgumentAttribute.Aliases);
                            if (containsCmdLineArg)
                            {
                                cmdLineArgValue = "False";
                            }
                        }
                    }
                    //else if (ChoType.GetMemberType(memberInfo).IsEnum)
                    //{
                    //    containsCmdLineArg = IsSwitchSpecified(commandLineArgParser, Enum.GetNames(ChoType.GetMemberType(memberInfo)));
                    //    if (containsCmdLineArg)
                    //        cmdLineArgValue = GetCmdLineArgValue(commandLineArgParser, Enum.GetNames(ChoType.GetMemberType(memberInfo)));
                    //    else
                    //        cmdLineArgValue = GetCmdLineArgValue(commandLineArgParser, commandLineArgumentAttribute.CommandLineSwitch, commandLineArgumentAttribute.Aliases);
                    //}
                    else
                    {
                        cmdLineArgValue = GetCmdLineArgValue(commandLineArgParser, commandLineArgumentAttribute.CommandLineSwitch, commandLineArgumentAttribute.Aliases);
                    }
                }
                else
                {
                    return(null);
                }

                //if (ChoType.GetMemberType(memberInfo) != typeof(bool))
                //{
                isDefaultValueSpecified  = ChoCmdLineArgMetaDataManager.TryGetDefaultValue(commandLineArgObject, name, defaultCommandLineArgAttribute, out defaultValue);
                isFallbackValueSpecified = ChoCmdLineArgMetaDataManager.TryGetFallbackValue(commandLineArgObject, name, defaultCommandLineArgAttribute, out fallbackValue);
                //}

                try
                {
                    if (isFallbackValueSpecified)
                    {
                        //                    fallbackValueObj = ChoConvert.ConvertFrom(commandLineArgObject, ChoString.ExpandPropertiesEx(fallbackValue),
                        //ChoType.GetMemberType(memberInfo),
                        //ChoTypeDescriptor.GetTypeConverters(memberInfo), ChoTypeDescriptor.GetTypeConverterParams(memberInfo));

                        fallbackValueObj = ChoConvert.ConvertFrom(ChoString.ExpandPropertiesEx(fallbackValue), memberInfo, commandLineArgObject);
                    }
                }
                catch
                {
                }

                try
                {
                    if (isDefaultValueSpecified)
                    {
                        //defaultValueObj = ChoConvert.ConvertFrom(commandLineArgObject, ChoString.ExpandPropertiesEx(defaultValue), ChoType.GetMemberType(memberInfo),
                        //    ChoTypeDescriptor.GetTypeConverters(memberInfo), ChoTypeDescriptor.GetTypeConverterParams(memberInfo));
                        defaultValueObj = ChoConvert.ConvertFrom(ChoString.ExpandPropertiesEx(defaultValue), memberInfo, commandLineArgObject);
                    }
                }
                catch
                {
                }

                if (commandLineArgObject != null && !commandLineArgObject.RaiseBeforeCommandLineArgLoaded(memberInfo.Name, ref cmdLineArgValue, defaultValueObj, fallbackValueObj))
                {
                    if (!cmdLineArgValue.IsNull())
                    {
                        newCmdLineArgValue = ChoConvert.ConvertFrom(ChoString.ExpandPropertiesEx(cmdLineArgValue), memberInfo, commandLineArgObject);

                        //newCmdLineArgValue = ChoConvert.ConvertFrom(commandLineArgObject, ChoString.ExpandPropertiesEx(cmdLineArgValue),
                        //    ChoType.GetMemberType(memberInfo),
                        //    ChoTypeDescriptor.GetTypeConverters(memberInfo), ChoTypeDescriptor.GetTypeConverterParams(memberInfo));
                    }

                    if (newCmdLineArgValue == null && defaultCommandLineArgAttribute.IsRequired)
                    {
                        if (ChoType.GetMemberType(memberInfo) != typeof(bool))
                        {
                            if (commandLineArgumentAttribute != null)
                            {
                                throw new ChoCommandLineArgException("Missing arg value for '{0}' required command line switch.".FormatString(
                                                                         commandLineArgumentAttribute == null ? ChoCommandLineArgObject.DefaultCmdLineSwitch : commandLineArgumentAttribute.CommandLineSwitch),
                                                                     commandLineArgObject.GetUsage());
                            }
                            else if (posCommandLineArgAttribute != null)
                            {
                                if (posCommandLineArgAttribute.ShortName.IsNull())
                                {
                                    throw new ChoCommandLineArgException("Missing positional arg value at '{0}' position.".FormatString(
                                                                             posCommandLineArgAttribute == null ? ChoCommandLineArgObject.DefaultCmdLineSwitch : posCommandLineArgAttribute.Position.ToString()), commandLineArgObject.GetUsage());
                                }
                                else
                                {
                                    throw new ChoCommandLineArgException("Missing '{0}' argument.".FormatString(posCommandLineArgAttribute.ShortName), commandLineArgObject.GetUsage());
                                }
                            }
                            else
                            {
                                throw new ChoCommandLineArgException("Missing arg value at '{0}' position.".FormatString(ChoCommandLineArgObject.DefaultCmdLineSwitch), commandLineArgObject.GetUsage());
                            }
                        }
                    }
                    else
                    {
                        if (newCmdLineArgValue == null)
                        {
                            if (isDefaultValueSpecified)
                            {
                                //if (ChoType.GetMemberType(memberInfo) != typeof(bool))
                                newCmdLineArgValue = defaultValueObj;
                                //else
                                //    newCmdLineArgValue = false;
                            }
                        }

                        ChoType.SetMemberValue(commandLineArgObject, memberInfo, newCmdLineArgValue);
                        if (commandLineArgObject != null)
                        {
                            commandLineArgObject.RaiseAfterCommandLineArgLoaded(memberInfo.Name, newCmdLineArgValue);
                        }
                    }
                }
            }
            catch (ChoFatalApplicationException)
            {
                throw;
            }
            catch (Exception ex)
            {
                if (commandLineArgObject != null && commandLineArgObject.RaiseCommandLineArgLoadError(memberInfo.Name, cmdLineArgValue, ex))
                {
                }
                else
                {
                    if (defaultCommandLineArgAttribute.IsRequired)
                    {
                        return(ex);
                    }

                    if (fallbackValueObj != null)
                    {
                        ChoType.SetMemberValue(commandLineArgObject, memberInfo, fallbackValueObj);
                    }
                    else
                    {
                        return(ex);
                    }
                }
            }
            return(null);
        }