-
-
Notifications
You must be signed in to change notification settings - Fork 725
/
NodeDescriptor~1.cs
121 lines (101 loc) · 3.99 KB
/
NodeDescriptor~1.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
using System;
using System.Linq.Expressions;
using System.Reflection;
using HotChocolate.Resolvers;
using HotChocolate.Resolvers.Expressions;
using HotChocolate.Types.Descriptors.Definitions;
using HotChocolate.Utilities;
using static HotChocolate.Properties.TypeResources;
#nullable enable
namespace HotChocolate.Types.Relay.Descriptors
{
public class NodeDescriptor<TNode>
: NodeDescriptorBase
, INodeDescriptor<TNode>
{
private readonly IObjectTypeDescriptor<TNode> _typeDescriptor;
public NodeDescriptor(IObjectTypeDescriptor<TNode> typeDescriptor)
: base(typeDescriptor.Extend().Context)
{
_typeDescriptor = typeDescriptor;
_typeDescriptor
.Implements<NodeType>()
.Extend()
.OnBeforeCreate(OnCompleteDefinition);
}
private void OnCompleteDefinition(ObjectTypeDefinition definition)
{
if (Definition.Resolver is null)
{
ResolveNodeWith<TNode>();
}
if (Definition.Resolver is not null)
{
definition.ContextData[WellKnownContextData.NodeResolver] =
Definition.Resolver;
}
}
protected override IObjectFieldDescriptor ConfigureNodeField()
{
Definition.NodeType = typeof(TNode);
if (Definition.IdMember is null)
{
Definition.IdMember = Context.TypeInspector.GetNodeIdMember(typeof(TNode));
}
return Definition.IdMember is null
? _typeDescriptor
.Field(NodeType.Names.Id)
.Type<NonNullType<IdType>>()
.Use<IdMiddleware>()
: _typeDescriptor
.Field(Definition.IdMember)
.Name(NodeType.Names.Id)
.Type<NonNullType<IdType>>()
.Use<IdMiddleware>();
}
public INodeDescriptor<TNode, TId> IdField<TId>(
Expression<Func<TNode, TId>> propertyOrMethod)
{
if (propertyOrMethod is null)
{
throw new ArgumentNullException(nameof(propertyOrMethod));
}
MemberInfo member = propertyOrMethod.TryExtractMember();
if (member is MethodInfo or PropertyInfo)
{
Definition.IdMember = member;
return new NodeDescriptor<TNode, TId>(Context, Definition, ConfigureNodeField);
}
throw new ArgumentException(NodeDescriptor_IdMember, nameof(member));
}
public INodeDescriptor<TNode> IdField(MemberInfo propertyOrMethod)
{
if (propertyOrMethod is null)
{
throw new ArgumentNullException(nameof(propertyOrMethod));
}
if (propertyOrMethod is MethodInfo or PropertyInfo)
{
Definition.IdMember = propertyOrMethod;
return this;
}
throw new ArgumentException(NodeDescriptor_IdField_MustBePropertyOrMethod);
}
public IObjectFieldDescriptor NodeResolver(
NodeResolverDelegate<TNode, object> nodeResolver) =>
ResolveNode<object>(
async (ctx, id) => (await nodeResolver(ctx, id).ConfigureAwait(false))!);
public IObjectFieldDescriptor NodeResolver<TId>(
NodeResolverDelegate<TNode, TId> nodeResolver) =>
ResolveNode<TId>(
async (ctx, id) => (await nodeResolver(ctx, id).ConfigureAwait(false))!);
public IObjectFieldDescriptor ResolveNodeWith<TResolver>() =>
ResolveNodeWith(Context.TypeInspector.GetNodeResolverMethod(
typeof(TNode),
typeof(TResolver))!);
public IObjectFieldDescriptor ResolveNodeWith(Type type) =>
ResolveNodeWith(Context.TypeInspector.GetNodeResolverMethod(
typeof(TNode),
type)!);
}
}