예제 #1
0
        public string Generate(
            string resolverName,
            FieldResolverDescriptor resolverDescriptor)
        {
            StringBuilder source = new StringBuilder();

            source.Append($"public static {nameof(FieldResolverDelegate)}");
            source.Append(" ");
            source.Append(resolverName);
            source.Append(" ");
            source.Append(" = ");
            source.Append("(ctx, ct) => {");
            source.AppendLine();

            foreach (FieldResolverArgumentDescriptor argumentDescriptor in resolverDescriptor.ArgumentDescriptors)
            {
                GenerateArgumentInvocation(argumentDescriptor, source);
                source.AppendLine();
            }

            GenerateResolverInvocation(resolverDescriptor, source);

            source.AppendLine();
            source.Append("};");
            return(source.ToString());
        }
 protected override void GenerateResolverInvocation(FieldResolverDescriptor resolverDescriptor, StringBuilder source)
 {
     source.AppendLine($"var resolver = ctx.{nameof(IResolverContext.Service)}<{GetTypeName(resolverDescriptor.ResolverType)}>();");
     HandleExceptions(source, s =>
     {
         s.Append($"return resolver.{resolverDescriptor.Member.Name};");
     });
 }
예제 #3
0
        public void RegisterResolver(FieldResolverDescriptor resolverDescriptor)
        {
            if (resolverDescriptor == null)
            {
                throw new ArgumentNullException(nameof(resolverDescriptor));
            }

            _resolverDescriptors[resolverDescriptor.Field] = resolverDescriptor;
        }
예제 #4
0
 private void TryAddPropertyResolver(
     MemberResolverBinding binding,
     List <FieldResolverDescriptor> resolverDescriptors)
 {
     if (binding.FieldMember is PropertyInfo p)
     {
         FieldReference fieldReference = new FieldReference(
             binding.TypeName, binding.FieldName);
         resolverDescriptors.Add(FieldResolverDescriptor
                                 .CreateSourceProperty(fieldReference, p.ReflectedType, p));
     }
 }
        private bool AllArgumentsMatch(Field field, FieldResolverDescriptor resolverDescriptor)
        {
            foreach (FieldResolverArgumentDescriptor argumentDescriptor in
                     resolverDescriptor.Arguments())
            {
                if (!field.Arguments.ContainsKey(argumentDescriptor.Name))
                {
                    return(false);
                }

                // TODO : Check that argument types are type compatible.
            }
            return(true);
        }
예제 #6
0
        protected override void GenerateResolverInvocation(
            FieldResolverDescriptor resolverDescriptor, StringBuilder source)
        {
            source.AppendLine($"var source = ctx.{nameof(IResolverContext.Parent)}<{resolverDescriptor.ResolverType.FullName}>();");
            source.AppendLine($"return source.{resolverDescriptor.Member.Name} (");

            if (resolverDescriptor.ArgumentDescriptors.Any())
            {
                string arguments = string.Join(", ",
                                               resolverDescriptor.ArgumentDescriptors.Select(t => t.Name));
                source.AppendLine(arguments);
            }

            source.Append(");");
        }
 protected override void GenerateResolverInvocation(
     FieldResolverDescriptor resolverDescriptor, StringBuilder source)
 {
     source.AppendLine($"var source = ctx.{nameof(IResolverContext.Parent)}<{GetTypeName(resolverDescriptor.ResolverType)}>();");
     HandleExceptions(source, s =>
     {
         s.Append($"return source.{resolverDescriptor.Member.Name}(");
         if (resolverDescriptor.ArgumentDescriptors.Any())
         {
             string arguments = string.Join(", ",
                                            resolverDescriptor.ArgumentDescriptors.Select(t => t.VariableName));
             s.Append(arguments);
         }
         s.Append(");");
     });
 }
예제 #8
0
 private void TryAddMethodResolver(
     MemberResolverBinding binding,
     List <FieldResolverDescriptor> resolverDescriptors)
 {
     if (binding.FieldMember is MethodInfo m)
     {
         FieldReference fieldReference = new FieldReference(binding.TypeName, binding.FieldName);
         bool           isAsync        = typeof(Task).IsAssignableFrom(m.ReturnType);
         IReadOnlyCollection <FieldResolverArgumentDescriptor> argumentDescriptors =
             FieldResolverDiscoverer.CreateResolverArgumentDescriptors(
                 m, m.ReflectedType, m.ReflectedType);
         resolverDescriptors.Add(FieldResolverDescriptor.CreateSourceMethod(
                                     fieldReference, m.ReflectedType, m, isAsync,
                                     argumentDescriptors));
     }
 }
예제 #9
0
        protected override void GenerateResolverInvocation(
            FieldResolverDescriptor resolverDescriptor,
            StringBuilder source)
        {
            source.AppendLine($"var resolver = ctx.{nameof(IResolverContext.Service)}<{GetTypeName(resolverDescriptor.ResolverType)}>();");
            source.AppendLine("Func<Task<object>> f = async () => {");

            HandleExceptions(source, s =>
            {
                s.Append($"return await resolver.{resolverDescriptor.Member.Name}(");
                if (resolverDescriptor.ArgumentDescriptors.Any())
                {
                    string arguments = string.Join(", ",
                                                   resolverDescriptor.ArgumentDescriptors.Select(t => t.Name));
                    s.Append(arguments);
                }
                s.Append(");");
            });

            source.AppendLine("};");
            source.Append("return f();");
        }
예제 #10
0
        private IEnumerable <FieldResolver> CompileResolvers()
        {
            List <FieldResolverDescriptor> resolverDescriptors =
                new List <FieldResolverDescriptor>();

            foreach (MemberResolverBinding binding in _resolverBindings.Values
                     .OfType <MemberResolverBinding>())
            {
                if (binding.FieldMember is PropertyInfo p)
                {
                    FieldReference fieldReference = new FieldReference(
                        binding.TypeName, binding.FieldName);
                    resolverDescriptors.Add(FieldResolverDescriptor
                                            .CreateSourceProperty(fieldReference, p.ReflectedType, p));
                }

                if (binding.FieldMember is MethodInfo m)
                {
                    FieldReference fieldReference = new FieldReference(binding.TypeName, binding.FieldName);
                    bool           isAsync        = typeof(Task).IsAssignableFrom(m.ReturnType);
                    IReadOnlyCollection <FieldResolverArgumentDescriptor> argumentDescriptors =
                        FieldResolverDiscoverer.CreateResolverArgumentDescriptors(
                            m, m.ReflectedType, m.ReflectedType);
                    resolverDescriptors.Add(FieldResolverDescriptor.CreateSourceMethod(
                                                fieldReference, m.ReflectedType, m, isAsync,
                                                argumentDescriptors));
                }
            }
            resolverDescriptors.AddRange(_resolverDescriptors.Values);

            if (resolverDescriptors.Any())
            {
                return(_resolverBuilder.Build(resolverDescriptors));
            }
            return(Enumerable.Empty <FieldResolver>());
        }
예제 #11
0
 public override bool CanGenerate(
     FieldResolverDescriptor resolverDescriptor)
 => !resolverDescriptor.IsAsync &&
 resolverDescriptor.IsMethod &&
 resolverDescriptor.Kind == FieldResolverKind.Source;
예제 #12
0
 protected override void GenerateResolverInvocation(FieldResolverDescriptor resolverDescriptor, StringBuilder source)
 {
     source.AppendLine($"var source = ctx.{nameof(IResolverContext.Parent)}<{resolverDescriptor.ResolverType.FullName}>();");
     source.AppendLine($"return source.{resolverDescriptor.Member.Name};");
 }
예제 #13
0
 public override bool CanGenerate(
     FieldResolverDescriptor resolverDescriptor)
 => resolverDescriptor.Kind == FieldResolverKind.Source &&
 !resolverDescriptor.IsMethod;
예제 #14
0
 public abstract bool CanGenerate(
     FieldResolverDescriptor resolverDescriptor);
예제 #15
0
 protected abstract void GenerateResolverInvocation(
     FieldResolverDescriptor resolverDescriptor,
     StringBuilder source);
 public override bool CanGenerate(
     FieldResolverDescriptor resolverDescriptor)
 => resolverDescriptor.IsAsync &&
 resolverDescriptor.IsMethod &&
 resolverDescriptor.Kind == FieldResolverKind.Collection;