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); } }
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)); } }
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); }
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)); }
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)); } }
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)); } }
public ReflectedParser(ReflectedParserSettings parserSettings) { _parserSettings = parserSettings ?? throw new ArgumentNullException(nameof(parserSettings)); }