public static IGraphQlScalarResult <TContract> Defer <TInput, TContract>(this IGraphQlScalarResult <TInput> original, Func <IGraphQlResultFactory <TInput>, IGraphQlScalarResult <TContract> > func)
        {
            var newResult           = func(new GraphQlResultFactory <TInput>(original.FieldContext));
            var constructedDeferred = newResult.ConstructResult();

            return(original.AddResolve <TContract>(constructedDeferred));
        }
Beispiel #2
0
        public static IGraphQlScalarResult <T> Catch <T>(this IGraphQlScalarResult <T> original)
            where T : class
        {
            // EFCore works better when it works off of anonymous objects generated by the compiler. Expression.Constant on the FieldContext causes an error here
            Expression <Func <Func <T>, Expression <Func <T> >, IFinalizer> > expression = (func, exp) => new CatchFinalizerFactory(original.FieldContext, exp).Catch(func);

            return(original.AddResolve <T>(p => Expression.Lambda(expression.Inline(Expression.Lambda <Func <T> >(p), Expression.Quote(Expression.Lambda <Func <T> >(p))), p)));
        }
Beispiel #3
0
        public static IGraphQlScalarResult <TContract> Nullable <TInput, TContract>(this IGraphQlScalarResult <TInput?> original, Func <IGraphQlResultFactory <TInput>, IGraphQlScalarResult <TContract> > func)
            where TInput : class
            where TContract : class
        {
            var newResult           = func(new GraphQlResultFactory <TInput>(original.FieldContext));
            var constructedDeferred = newResult.ConstructResult();


            var newScalar = original.AddResolve <TContract>(p => Expression.Lambda(p.IfNotNull(constructedDeferred.Inline(p)), p));

            return(newScalar.Catch());
        }
        public GraphQlExpressionObjectResult(
            IGraphQlScalarResult resolution,
            IContract contract)
        {
            this.Resolution = resolution;
            this.Contract   = contract ?? throw new ArgumentException("Expected a contract but had none.", nameof(resolution));

            visitor = new GraphQlContractExpressionReplaceVisitor();
            resolution.ApplyVisitor <object>(visitor);
            if (visitor.ModelType == null)
            {
                throw new ArgumentException("The provided resolver did not have a contract.", nameof(resolution));
            }
        }
        public static IGraphQlObjectResult <TContract> Defer <TInput, TContract>(this IGraphQlScalarResult <TInput> original, Func <IGraphQlResultFactory <TInput>, IGraphQlObjectResult <TContract> > func)
        {
            var newResult           = func(new GraphQlResultFactory <TInput>(original.FieldContext));
            var constructedDeferred = newResult.Resolution
                                      .ConstructResult();

            var param         = Expression.Parameter(typeof(object), "inputForDeferred");
            var deferResolver = Expression.Lambda(Deferred.newPreamble.Inline(param, PreamblePlaceholders.BodyPlaceholderExpression), param);
            var outParam      = Expression.Parameter(typeof(object), "outputForDeferred");

            var newScalar = original.AddResolve <object>(deferResolver)
                            .AddResolve <object>(Expression.Lambda(Expression.Convert(outParam, constructedDeferred.Parameters[0].Type), outParam))
                            .AddResolve <object>(constructedDeferred);

            return(newResult.AdjustResolution <TContract>(_ => newScalar));
        }
        public static async Task <ExecutionResult> InvokeResult(this IGraphQlScalarResult resolved, object input, ILogger logger, CancellationToken cancellationToken)
        {
            if (resolved.Joins.Any())
            {
                throw new InvalidOperationException("Cannot join at the root level");
            }
            var constructedResult = resolved.ConstructResult();
            var finalResult = new ExpressionVisitor[] {
                new ExpressionSimplifier(),
            }.Aggregate(constructedResult, (prev, next) => next.VisitAndConvert(prev, nameof(InvokeResult)));

            var result           = InvokeExpression(input, finalResult);
            var finalizerContext = new FinalizerContext(UnrollResults, logger, cancellationToken);
            var finalizedResult  = await UnrollResults(result, finalizerContext).ConfigureAwait(false);

            return(new ExecutionResult(false, finalizedResult, finalizerContext.Errors.ToArray()));
        }
Beispiel #7
0
 public static IGraphQlObjectResult <Interfaces.Character> AsCharacterUnion(IGraphQlScalarResult <Domain.Character> characterResult)
 {
     return(characterResult.AsUnion <Interfaces.Character>(CharacterTypeMapping));
 }
Beispiel #8
0
 private static IGraphQlScalarResult Inline(IGraphQlScalarResult original, LambdaExpression expressionToInline)
 {
     return(original.AddResolve <object>(expressionToInline));
 }