src/Epam.GraphQL/Configuration/Implementations/Fields/UnionQueryField.cs (133 lines of code) (raw):

// Copyright © 2020 EPAM Systems, Inc. All Rights Reserved. All information contained herein is, and remains the // property of EPAM Systems, Inc. and/or its suppliers and is protected by international intellectual // property law. Dissemination of this information or reproduction of this material is strictly forbidden, // unless prior written permission is obtained from EPAM Systems, Inc using System; using System.Collections.Generic; using System.Threading.Tasks; using Epam.GraphQL.Builders.Loader; using Epam.GraphQL.Configuration.Implementations.Descriptors; using Epam.GraphQL.Configuration.Implementations.Fields.Helpers; using Epam.GraphQL.Configuration.Implementations.Fields.ResolvableFields; using Epam.GraphQL.Diagnostics; using Epam.GraphQL.Helpers; namespace Epam.GraphQL.Configuration.Implementations.Fields { internal static class UnionQueryField { public static UnionQueryField<TExecutionContext> Create<TLastElementType, TExecutionContext>( IInlinedChainConfigurationContext configurationContext, BaseObjectGraphTypeConfigurator<object, TExecutionContext> parent, string name, Action<IInlineObjectBuilder<TLastElementType, TExecutionContext>>? build) { return new UnionQueryField<TExecutionContext>(configurationContext, parent, name, typeof(TLastElementType), CreateTypeResolver(build, configurationContext)); } public static Func<UnionFieldBase<object, TExecutionContext>, IGraphTypeDescriptor<TExecutionContext>> CreateTypeResolver<TLastElementType, TExecutionContext>( Action<IInlineObjectBuilder<TLastElementType, TExecutionContext>>? build, IInlinedChainConfigurationContext configurationContext) { return field => field.Parent.GetGraphQLTypeDescriptor(field, build, configurationContext); } } internal class UnionQueryField<TExecutionContext> : UnionFieldBase<object, TExecutionContext>, IUnionableRootField<TExecutionContext> { public UnionQueryField( IChainConfigurationContext configurationContext, BaseObjectGraphTypeConfigurator<object, TExecutionContext> parent, string name, Type unionType, Func<UnionFieldBase<object, TExecutionContext>, IGraphTypeDescriptor<TExecutionContext>> graphTypeFactory) : base(configurationContext, parent, name, unionType, graphTypeFactory) { } private UnionQueryField( IChainConfigurationContext configurationContext, BaseObjectGraphTypeConfigurator<object, TExecutionContext> parent, string name, Type unionType, Func<UnionFieldBase<object, TExecutionContext>, IGraphTypeDescriptor<TExecutionContext>> graphTypeFactory, UnionGraphTypeDescriptor<TExecutionContext> unionGraphType) : base( configurationContext, parent, name, unionType, graphTypeFactory, unionGraphType) { } public IVoid Resolve<TReturnType>(Func<TExecutionContext, TReturnType> resolve, Action<IInlineObjectBuilder<TReturnType, TExecutionContext>>? build) { var resolver = ResolvedFieldResolverFactory.Create( Resolvers.ConvertFieldResolver(resolve)); return Parent.ApplyResolvedField<TReturnType>( ConfigurationContext.Chain<TReturnType>(nameof(Resolve)) .Argument(resolve) .OptionalArgument(build), this, GraphType, resolver); } public IVoid Resolve<TReturnType>(Func<TExecutionContext, Task<TReturnType>> resolve, Action<IInlineObjectBuilder<TReturnType, TExecutionContext>>? build) { var resolver = ResolvedFieldResolverFactory.Create( Resolvers.ConvertFieldResolver(resolve)); return Parent.ApplyResolvedField<TReturnType>( ConfigurationContext.Chain<TReturnType>(nameof(Resolve)) .Argument(resolve) .OptionalArgument(build), this, GraphType, resolver); } public IVoid Resolve<TReturnType>(Func<TExecutionContext, IEnumerable<TReturnType>> resolve, Action<IInlineObjectBuilder<TReturnType, TExecutionContext>>? build) { var resolver = ResolvedFieldResolverFactory.Create( Resolvers.ConvertFieldResolver(resolve)); return Parent.ApplyResolvedField<IEnumerable<TReturnType>>( ConfigurationContext.Chain<TReturnType>(nameof(Resolve)) .Argument(resolve) .OptionalArgument(build), this, GraphType.MakeListDescriptor(), resolver); } public IVoid Resolve<TReturnType>(Func<TExecutionContext, Task<IEnumerable<TReturnType>>> resolve, Action<IInlineObjectBuilder<TReturnType, TExecutionContext>>? build) { var resolver = ResolvedFieldResolverFactory.Create( Resolvers.ConvertFieldResolver(resolve)); return Parent.ApplyResolvedField<IEnumerable<TReturnType>>( ConfigurationContext.Chain<TReturnType>(nameof(Resolve)) .Argument(resolve) .OptionalArgument(build), this, GraphType.MakeListDescriptor(), resolver); } public IUnionableRootField<TExecutionContext> AsUnionOf<TLastElementType>(Action<IInlineObjectBuilder<TLastElementType, TExecutionContext>>? build) { return And(build); } public IUnionableRootField<TExecutionContext> And<TLastElementType>(Action<IInlineObjectBuilder<TLastElementType, TExecutionContext>>? build) { var configurationContext = ConfigurationContext.Chain<TLastElementType>(nameof(And)).OptionalArgument(build); var unionField = new UnionQueryField<TExecutionContext>( configurationContext, Parent, Name, typeof(TLastElementType), UnionMutationField.CreateTypeResolver(build, configurationContext), UnionGraphType); return ApplyField(unionField); } public IUnionableRootField<TExecutionContext> AsUnionOf<TEnumerable, TLastElementType>(Action<IInlineObjectBuilder<TLastElementType, TExecutionContext>>? build) where TEnumerable : IEnumerable<TLastElementType> { return And<TEnumerable, TLastElementType>(build); } public IUnionableRootField<TExecutionContext> And<TEnumerable, TLastElementType>(Action<IInlineObjectBuilder<TLastElementType, TExecutionContext>>? build) where TEnumerable : IEnumerable<TLastElementType> { return And(build); } } }