Example #1
0
        public static IParser <T> CastParser <T>(this object parser)
        {
            var parserType = parser.GetType();

            var nameGetter     = DynamicProperty.GetProperty(parserType, nameof(Parser <object> .Name));
            var tryParseMethod = parserType.GetMethod(nameof(Parser <object> .TryParse));
            var tryParse       = DynamicMethod.GetMethod(tryParseMethod);

            var parseResult = tryParseMethod.ReturnType;
            var isSuccess   = DynamicMethod.GetMethod(parseResult,
                                                      nameof(IParseResult <object> .IsSuccess));
            var errorGetter  = DynamicProperty.GetProperty(parseResult, nameof(IParseResult <object> .Error));
            var resultGetter = DynamicProperty.GetProperty(parseResult, nameof(IParseResult <object> .Result));
            var name         = (string)nameGetter(parser);

            return(new Parser <T>(name, inp =>
            {
                var parsed = tryParse(parser, new object[] { inp });
                if (!(bool)isSuccess(parsed, new object[0]))
                {
                    var error = (ParseError)errorGetter(parsed);
                    return Parse.Error <T>(error);
                }

                var result = resultGetter(parsed);
                return Parse.Success <T>(result);
            }));
        }