private static CliParseResult MapArguments(Parsable parsable, IEnumerable<string> args) { var result = new CliParseResult(); var parsableClass = Helper.GetObjectAttribute(parsable, typeof(ParsableClassAttribute)) as ParsableClassAttribute; var allowedPrefixes = GetParsableClassAllowedPrefixs(parsableClass); var ignoreUnknowns = parsableClass != null && parsableClass.IgnoreUnknowns; var tokens = Tokenizer.Tokenize(args, allowedPrefixes).ToList(); result.ShowHelp = tokens.Any(token=>IsHelpToken(token, parsable)); if (tokens.Count == 0) { if (parsableClass == null || parsableClass.ShowHelpWhenNoArgumentsProvided) result.ShowHelp = true; } var parsableType = parsable.GetType(); List<PropertyInfo> unsetProperties = parsableType.GetProperties().ToList(); List<PropertyInfo> tmpSetProperties = new List<PropertyInfo>(); // find by names foreach (var prop in unsetProperties) { foreach (var argument in prop.GetCustomAttributes(true).OfType<ParsableArgumentAttribute>()) { // find by name var token = GetTokenForArgumentByName(tokens, argument); var propertySet = false; if(token != null) propertySet = SetPropertyValue(parsable, token, tokens, argument, prop); if (!propertySet) { // find by position token = GetTokenForArgumentByPosition(tokens, argument); propertySet = SetPropertyValue(parsable, token, tokens, argument, prop); } // flag property as set and remove later. if (propertySet) { tmpSetProperties.Add(prop); } } } tmpSetProperties.ForEach(x => unsetProperties.Remove(x)); foreach (var unsetProperty in unsetProperties) { foreach (var argument in unsetProperty.GetCustomAttributes(true).OfType<ParsableArgumentAttribute>()) { if(argument.Required) result.AddErrorMessage(string.Format(CultureInfo.CurrentCulture,"Required argument '{0}' was not supplied.", argument.Name)); } } // unknown/unused aruments if (!result.ShowHelp && !ignoreUnknowns) { tokens.Where(x => !x.Taken) .ToList() .ForEach( x => result.AddErrorMessage(string.Format(CultureInfo.CurrentCulture, "Unknown argument '{0}' was supplied.", x.Value.ToString()))); } return result; }
public static object GetObjectAttribute(Parsable parsable, Type type) { var parsableType = parsable.GetType(); return parsableType.GetCustomAttributes(true).FirstOrDefault(x => x.GetType() == type); }
private static IEnumerable<ParsableArgumentAttribute> GetListArgumentAttributes(Parsable parsable) { var parsableType = parsable.GetType(); var properties = parsableType.GetProperties(); var arguments = new List<ParsableArgumentAttribute>(); foreach (var prop in properties) { arguments.AddRange(prop.GetCustomAttributes(true).OfType<ParsableArgumentAttribute>()); } return arguments; }