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); }
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); }