-
-
Notifications
You must be signed in to change notification settings - Fork 725
/
IdType.cs
168 lines (143 loc) · 4.57 KB
/
IdType.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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
using System;
using HotChocolate.Language;
using HotChocolate.Properties;
#nullable enable
namespace HotChocolate.Types
{
/// <summary>
/// The ID scalar type represents a unique identifier, often used to refetch
/// an object or as the key for a cache. The ID type is serialized in the
/// same way as a String; however, it is not intended to be human‐readable.
///
/// While it is often numeric, it should always serialize as a String.
///
/// http://facebook.github.io/graphql/June2018/#sec-ID
/// </summary>
[SpecScalar]
public sealed class IdType
: ScalarType<string>
{
/// <summary>
/// Initializes a new instance of the <see cref="IdType"/> class.
/// </summary>
public IdType()
: base(ScalarNames.ID, BindingBehavior.Explicit)
{
Description = TypeResources.IdType_Description;
}
/// <summary>
/// Initializes a new instance of the <see cref="IdType"/> class.
/// </summary>
public IdType(NameString name)
: base(name, BindingBehavior.Explicit)
{
}
/// <summary>
/// Initializes a new instance of the <see cref="IdType"/> class.
/// </summary>
public IdType(NameString name, string description)
: base(name, BindingBehavior.Explicit)
{
Description = description;
}
public override bool IsInstanceOfType(IValueNode literal)
{
if (literal is null)
{
throw new ArgumentNullException(nameof(literal));
}
return literal is StringValueNode
|| literal is IntValueNode
|| literal is NullValueNode;
}
public override object? ParseLiteral(IValueNode literal, bool withDefaults = true)
{
if (literal is null)
{
throw new ArgumentNullException(nameof(literal));
}
if (literal is StringValueNode stringLiteral)
{
return stringLiteral.Value;
}
if (literal is IntValueNode intLiteral)
{
return intLiteral.Value;
}
if (literal is NullValueNode)
{
return null;
}
throw new SerializationException(
TypeResourceHelper.Scalar_Cannot_ParseLiteral(Name, literal.GetType()),
this);
}
public override IValueNode ParseValue(object? runtimeValue)
{
if (runtimeValue is null)
{
return NullValueNode.Default;
}
if (runtimeValue is string s)
{
return new StringValueNode(s);
}
throw new SerializationException(
TypeResourceHelper.Scalar_Cannot_ParseValue(Name, runtimeValue.GetType()),
this);
}
public override IValueNode ParseResult(object? resultValue)
{
if (resultValue is null)
{
return NullValueNode.Default;
}
if (resultValue is string s)
{
return new StringValueNode(s);
}
if (resultValue is int i)
{
return new IntValueNode(i);
}
throw new SerializationException(
TypeResourceHelper.Scalar_Cannot_ParseResult(Name, resultValue.GetType()),
this);
}
public override bool TrySerialize(object? runtimeValue, out object? resultValue)
{
if (runtimeValue is null)
{
resultValue = null;
return true;
}
if (runtimeValue is string)
{
resultValue = runtimeValue;
return true;
}
resultValue = null;
return false;
}
public override bool TryDeserialize(object? resultValue, out object? runtimeValue)
{
if (resultValue is null)
{
runtimeValue = null;
return true;
}
if (resultValue is string)
{
runtimeValue = resultValue;
return true;
}
if (TryConvertSerialized(resultValue, ValueKind.Integer, out string c))
{
runtimeValue = c;
return true;
}
runtimeValue = null;
return false;
}
}
}