Esempio n. 1
0
        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;
        }
Esempio n. 2
0
 public static object GetObjectAttribute(Parsable parsable, Type type)
 {
     var parsableType = parsable.GetType();
     return parsableType.GetCustomAttributes(true).FirstOrDefault(x => x.GetType() == type);
 }
Esempio n. 3
0
        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;
        }