Skip to content

Commit 646da73

Browse files
committed
Upgrading parser to recognize null values in their own value type instead of Enum values
1 parent ba9f044 commit 646da73

4 files changed

Lines changed: 33 additions & 12 deletions

File tree

src/FSharp.Data.GraphQL.Shared/Ast.fs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,23 +79,25 @@ and FragmentDefinition = {
7979
SelectionSet: Selection list
8080
}
8181

82-
/// 2.2.7 Input Values
82+
/// 2.9 Input Values
8383
and Value =
84-
/// 2.2.7.1 Int Value
84+
/// 2.9.1 Int Value
8585
| IntValue of int64
86-
/// 2.2.7.2 Float Value
86+
/// 2.9.2 Float Value
8787
| FloatValue of double
88-
/// 2.2.7.3 Boolean Value
88+
/// 2.9.3 Boolean Value
8989
| BooleanValue of bool
90-
/// 2.2.7.4 String Value
90+
/// 2.9.4 String Value
9191
| StringValue of string
92-
/// 2.2.7.5 Enum Value
92+
/// 2.9.5 Null Value
93+
| NullValue
94+
/// 2.9.6 Enum Value
9395
| EnumValue of string
94-
/// 2.2.7.6 List Value
96+
/// 2.9.7 List Value
9597
| ListValue of Value list
96-
/// 2.2.7.7 Input Object Values
98+
/// 2.9.8 Input Object Values
9799
| ObjectValue of Map<string, Value>
98-
/// 2.2.8 Variables
100+
/// 2.10 Variables
99101
| Variable of string
100102

101103
/// 2.2.8 Variables

src/FSharp.Data.GraphQL.Shared/AstExtensions.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ type Document with
100100
| BooleanValue x -> sb.Append(if x then "true" else "false")
101101
| StringValue x -> sb.Append(withQuotes x)
102102
| EnumValue x -> sb.Append(x)
103+
| NullValue -> sb.Append("null")
103104
| ListValue x ->
104105
if x.Length > 0 then sb.Append("[ ")
105106
match x with

src/FSharp.Data.GraphQL.Shared/Parser.fs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,10 @@ module internal Internal =
142142
pipe3 integerPart fractionPart exponentPart
143143
(fun integer fraction exponent -> integer + fraction + exponent ) ] |>> float
144144

145+
// 2.9.5 Null Value
146+
let nullValue = stoken "null" >>% NullValue
145147

146-
// 2.9.5 EnumValue
148+
// 2.9.6 Enum Value
147149
// Name but not true or false or null
148150
// (boolean parser is run first)
149151
let enumValue = name
@@ -154,24 +156,26 @@ module internal Internal =
154156
let variable = pchar '$' >>. name
155157

156158

157-
// 2.9.7 Input Object Values
159+
// 2.9.8 Input Object Values
158160
let inputObject =
159161
betweenCharsMany '{' '}' (pairBetween ':' name inputValue <?> "ObjectField")
160162
|>> Map.ofList
161163

164+
// 2.9.7 List Value
162165
let listValue =
163166
betweenCharsMany '[' ']' (token_ws inputValue <?> "Value")
164167

165168

166169
// 2.9 Value
167170
// Variable|IntValue|FloatValue|StringValue|
168-
// BooleanValue|EnumValue|ListValue|ObjectValue
171+
// BooleanValue|NullValue|EnumValue|ListValue|ObjectValue
169172
inputValueRef :=
170173
choice [ variable |>> Variable <?> "Variable"
171174
(attempt floatValue) |>> FloatValue <?> "Float"
172175
integerValue |>> IntValue <?> "Integer"
173176
stringValue |>> StringValue <?> "String"
174177
(attempt booleanValue) |>> BooleanValue <?> "Boolean"
178+
nullValue
175179
enumValue |>> EnumValue <?> "Enum"
176180
inputObject |>> ObjectValue <?> "InputObject"
177181
listValue |>> ListValue <?> "ListValue" ]

tests/FSharp.Data.GraphQL.Tests/ParserTests.fs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ let queryWithSelection selection = queryWithSelections [ selection ]
3636

3737
let arg name value = { Argument.Name = name; Value = value }
3838
let argInt name value = arg name (IntValue (int64 value))
39+
let argNull name = arg name NullValue
3940
let fieldWithNameAndArgsAndSelections name arguments selections =
4041
Field { Name = name
4142
Alias = None
@@ -269,6 +270,19 @@ let ``parser should parse GraphQL``() =
269270
}
270271
}
271272
}"""
273+
274+
[<Fact>]
275+
let ``parser should parse query with null arguments``() =
276+
let expected =
277+
[ field "name" ]
278+
|> fieldWithNameAndArgsAndSelections "user" [ argNull "id" ]
279+
|> queryWithSelection
280+
|> doc1
281+
test expected """{
282+
user(id: null) {
283+
name
284+
}
285+
}"""
272286

273287
[<Fact>]
274288
let ``parser should parse query with arguments``() =

0 commit comments

Comments
 (0)