internal static FieldType CreateFieldType <TResolvedType>(LiteralGraphTypeMemberInfo member) where TResolvedType : IGraphType, new() { return(new FieldType { Name = member.Name, Type = typeof(TResolvedType), Resolver = CreateFieldResolverFor(member) }); }
internal static FieldTypeResolver MakeFieldTypeResolverForMember(LiteralGraphTypeMemberInfo member, FieldTypeResolver complexFieldTypeResolver) { var type = member.Type; if (type == LiteralGraphTypeMemberInfoType.Complex) { return(complexFieldTypeResolver); } LiteralGraphTypeMemberInfoFieldTypeResolverMappings.TryGetValue(type, out var resolver); return(resolver); }
internal static FieldTypeResolver GetFieldTypeResolverForMember(LiteralGraphTypeMemberInfo member, FieldTypeResolver complexFieldTypeResolver) { var memberFieldTypeResolverMapKey = MakeMemberFieldTypeResolverMapKey(member); // If we don't already know the fieldtype resolver for this member, we need to figure it out if (!MemberFieldTypeResolverMappings.TryGetValue(memberFieldTypeResolverMapKey, out var fieldTypeResolver) || fieldTypeResolver == null) { // Try to create a new field type resolver fieldTypeResolver = MakeFieldTypeResolverForMember(member, complexFieldTypeResolver); if (fieldTypeResolver == null) { return(null); } // Save the resolver MemberFieldTypeResolverMappings.AddOrUpdate(memberFieldTypeResolverMapKey, fieldTypeResolver, (m, old) => fieldTypeResolver); } return(fieldTypeResolver); }
internal static FieldType GetFieldTypeForMember(LiteralGraphTypeMemberInfo member, FieldTypeResolver complexFieldTypeResolver) { var memberFieldTypeMapKey = MakeMemberFieldTypeMapKey(member); // Try to find an existing FieldType for this member if (!MemberFieldTypeMappings.TryGetValue(memberFieldTypeMapKey, out var fieldType)) { // Throw a new FieldType in to indicate we're in the middle of resolving a FieldType fieldType = new FieldType(); MemberFieldTypeMappings.AddOrUpdate(memberFieldTypeMapKey, fieldType, (m, old) => fieldType); // Get the fieldtype resolver var fieldTypeResolver = GetFieldTypeResolverForMember(member, complexFieldTypeResolver); // Execute the resolver var actualFieldType = fieldTypeResolver(member); // Copy over fields PatchFieldType(fieldType, actualFieldType); } return(fieldType); }
internal static IFieldResolver CreateFieldResolverFor(LiteralGraphTypeMemberInfo member) { return(new FuncFieldResolver <object>(ctx => member.GetValueFn(ctx))); }
private static string MakeMemberFieldTypeMapKey(LiteralGraphTypeMemberInfo member) => $"{member.DeclaringTypeName}.{member.Name}";
internal static string MakeMemberFieldTypeResolverMapKey(LiteralGraphTypeMemberInfo member) => $"{member.DeclaringTypeName}.{member.Name}";