Example #1
0
        public object?Parse(ParserState args, Type toType)
        {
            if (toType.IsArray)
            {
                return(ParseArray(args, toType));
            }

            var temp = args.Clone();

            string Consume()
            {
                if (!temp.HasCurrent)
                {
                    throw new CommandLineException(args, "Value is missing.");
                }
                return(temp.Consume());
            }

            try
            {
                if (toType == typeof(bool))
                {
                    return(bool.Parse(Consume()));
                }
                else if (toType == typeof(int))
                {
                    return(int.Parse(Consume()));
                }
                else if (toType == typeof(double))
                {
                    return(double.Parse(Consume()));
                }
                else if (toType == typeof(string))
                {
                    return(Consume());
                }
                else if (toType.IsEnum)
                {
                    var enumName = Enum.GetNames(toType).FindByName(_ => Parser.LongNameForCsharpIdentifier(_), Consume(), "values");
                    return(Enum.Parse(toType, enumName));
                }
                throw new ArgumentException($"Cannot parse {args.Current.Quote()} as {toType.Name}.");
            }
            catch (Exception e)
            {
                temp.SetPos(args);
                if (e is CommandLineException)
                {
                    throw;
                }
                throw new CommandLineException(args, $"{args.Current.Quote()} is not a value of type {toType.Name}.", e);
            }
            finally
            {
                args.SetPos(temp);
            }
        }
Example #2
0
        public object?ParseArray(ParserState args, Type toType)
        {
            var temp = args.Clone();

            var elementType = toType.GetElementType();

            var items = new List <object?>();

            while (temp.HasCurrent)
            {
                var item = Parse(temp, elementType);
                items.Add(item);
            }

            args.SetPos(temp);

            var a = Array.CreateInstance(elementType, items.Count);

            for (int i = 0; i < a.Length; ++i)
            {
                a.SetValue(items[i], i);
            }
            return(a);
        }