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};"); }); }
public void RegisterResolver(FieldResolverDescriptor resolverDescriptor) { if (resolverDescriptor == null) { throw new ArgumentNullException(nameof(resolverDescriptor)); } _resolverDescriptors[resolverDescriptor.Field] = resolverDescriptor; }
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); }
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(");"); }); }
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)); } }
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();"); }
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>()); }
public override bool CanGenerate( FieldResolverDescriptor resolverDescriptor) => !resolverDescriptor.IsAsync && resolverDescriptor.IsMethod && resolverDescriptor.Kind == FieldResolverKind.Source;
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};"); }
public override bool CanGenerate( FieldResolverDescriptor resolverDescriptor) => resolverDescriptor.Kind == FieldResolverKind.Source && !resolverDescriptor.IsMethod;
public abstract bool CanGenerate( FieldResolverDescriptor resolverDescriptor);
protected abstract void GenerateResolverInvocation( FieldResolverDescriptor resolverDescriptor, StringBuilder source);
public override bool CanGenerate( FieldResolverDescriptor resolverDescriptor) => resolverDescriptor.IsAsync && resolverDescriptor.IsMethod && resolverDescriptor.Kind == FieldResolverKind.Collection;