Beispiel #1
0
        private Message TryParseNullable <TParse>(ReflectedParserSettings parserSettings, string text, out TParse?result) where TParse : struct
        {
            if (string.IsNullOrWhiteSpace(text))
            {
                result = null;
                return(Message.NoError);
            }
            else
            {
                var msg = TryParse <TParse>(parserSettings, text, out var valueResult);
                result = valueResult;

                return(msg);
            }
        }
Beispiel #2
0
 private Message TryParseEnum <TParse>(ReflectedParserSettings parserSettings, string text, out TParse result) where TParse : struct
 {
     if (Enum.TryParse(text, parserSettings.EnumIgnoreCase, out result))
     {
         return(Message.NoError);
     }
     else if (parserSettings.UseParserMessage)
     {
         return(new Message($"The value {text} is not defined for the enum {typeof(TParse).Name}."));
     }
     else
     {
         return(parserSettings.TypeErrorMessage(text));
     }
 }
Beispiel #3
0
        private Message TryParseArray <TParse>(ReflectedParserSettings parserSettings, string[] args, out TParse[] result)
        {
            var arr = new TParse[args.Length];

            result = null;

            var msg = Message.NoError;

            for (int i = 0; i < args.Length; i++)
            {
                msg += TryParse(parserSettings, args[i], out arr[i]);
            }

            result = arr;
            return(msg);
        }
Beispiel #4
0
        private Message TryParseSingle <TParse>(ReflectedParserSettings parserSettings, string[] args, out TParse result)
        {
            result = default(TParse);

            if (args.Length == 0)
            {
                if (parserSettings.NoValueMessage.IsError)
                {
                    return(parserSettings.NoValueMessage);
                }
                else
                {
                    args = new string[] { string.Empty }
                };
            }
            else if (args.Length > 1)
            {
                return(parserSettings.MultipleValuesMessage);
            }

            return(TryParse(parserSettings, args[0], out result));
        }
Beispiel #5
0
        private Message TryParse <TParse>(ReflectedParserSettings parserSettings, string[] args, out TParse result)
        {
            if (typeof(TParse).IsArray)
            {
                var arrayType = typeof(TParse).GetElementType();

                var arrMethod = GetType()
                                .GetTypeInfo()
                                .GetDeclaredMethod(nameof(TryParseArray))
                                .MakeGenericMethod(arrayType);

                var arrMethodArgs = new object[3];
                arrMethodArgs[0] = parserSettings;
                arrMethodArgs[1] = args;

                var msg = arrMethod.Invoke(this, arrMethodArgs);
                result = (TParse)arrMethodArgs[2];
                return((Message)msg);
            }
            else
            {
                return(TryParseSingle(parserSettings, args, out result));
            }
        }
Beispiel #6
0
        private Message TryParse <TParse>(ReflectedParserSettings parserSettings, string text, out TParse result)
        {
            if (typeof(TParse) == typeof(string))
            {
                result = (TParse)(object)text;
                return(Message.NoError);
            }
            else if (Nullable.GetUnderlyingType(typeof(TParse)) != null)
            {
                var nullableType = Nullable.GetUnderlyingType(typeof(TParse));

                var nullableMethod = GetType()
                                     .GetTypeInfo()
                                     .GetDeclaredMethod(nameof(TryParseNullable))
                                     .MakeGenericMethod(nullableType);

                var arrMethodArgs = new object[3];
                arrMethodArgs[0] = parserSettings;
                arrMethodArgs[1] = text;

                var msg = nullableMethod.Invoke(this, arrMethodArgs);
                result = (TParse)arrMethodArgs[2];
                return((Message)msg);
            }
            else if (typeof(TParse).GetTypeInfo().IsEnum)
            {
                var nullableMethod = GetType()
                                     .GetTypeInfo()
                                     .GetDeclaredMethod(nameof(TryParseEnum))
                                     .MakeGenericMethod(typeof(TParse));

                var arrMethodArgs = new object[3];
                arrMethodArgs[0] = parserSettings;
                arrMethodArgs[1] = text;

                var msg = nullableMethod.Invoke(this, arrMethodArgs);
                result = (TParse)arrMethodArgs[2];
                return((Message)msg);
            }
            else if (TryGetMessageTryParse <TParse>(out var messageParser))
            {
                Message msg = messageParser(text, out result);
                if (msg.IsError && !parserSettings.UseParserMessage)
                {
                    return(parserSettings.TypeErrorMessage(text));
                }
                else
                {
                    return(msg);
                }
            }
            else if (TryGetTryParse <TParse>(out var simpleParser))
            {
                bool parsed = simpleParser(text, out result);
                if (!parsed)
                {
                    return(parserSettings.TypeErrorMessage(text));
                }
                else
                {
                    return(Message.NoError);
                }
            }
            else
            {
                throw new MissingParserException(typeof(TParse));
            }
        }
Beispiel #7
0
 public ReflectedParser(ReflectedParserSettings parserSettings)
 {
     _parserSettings = parserSettings ?? throw new ArgumentNullException(nameof(parserSettings));
 }