Skip to content

Commit eb180ec

Browse files
committed
Support descriptions on variable definitions
1 parent a44e5b4 commit eb180ec

File tree

4 files changed

+79
-60
lines changed

4 files changed

+79
-60
lines changed

juniper/CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ All user visible changes to `juniper` crate will be documented in this file. Thi
1616
- Made `includeDeprecated` argument of `__Type.fields`, `__Type.enumValues`, `__Type.inputFields`, `__Field.args` and `__Directive.args` fields non-`Null`. ([#1348], [graphql/graphql-spec#1142])
1717
- Made `@deprecated(reason:)` argument non-`Null`. ([#1348], [graphql/graphql-spec#1040])
1818
- Changed `ScalarToken::String` to contain raw quoted and escaped `StringLiteral` (was unquoted but escaped string before). ([#1349])
19-
- Added `description` field to `ast::Operation` and `ast::Fragment` field. ([#1349], [graphql/graphql-spec#1170])
19+
- Added `description` field to `ast::Operation`, `ast::Fragment` and `ast::VariableDefinition`. ([#1349], [graphql/graphql-spec#1170])
2020
- Added `LexerError::UnterminatedBlockString` variant. ([#1349])
2121

2222
### Added
@@ -33,7 +33,7 @@ All user visible changes to `juniper` crate will be documented in this file. Thi
3333
- `schema::meta::Argument::deprecation_status` field.
3434
- Support for variable-length escaped Unicode characters (e.g. `\u{110000}`) in strings. ([#1349], [graphql/graphql-spec#849], [graphql/graphql-spec#687])
3535
- Full Unicode range support. ([#1349], [graphql/graphql-spec#849], [graphql/graphql-spec#687])
36-
- Support parsing descriptions on fragments. ([#1349], [graphql/graphql-spec#1170])
36+
- Support parsing descriptions on operations, fragments and variable definitions. ([#1349], [graphql/graphql-spec#1170])
3737
- Support for [block strings][0180-1]. ([#1349])
3838

3939
### Changed

juniper/src/ast.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,7 @@ pub enum InputValue<S = DefaultScalarValue> {
307307

308308
#[derive(Clone, Debug, PartialEq)]
309309
pub struct VariableDefinition<'a, S> {
310+
pub description: Option<Spanning<Cow<'a, str>>>,
310311
pub var_type: Spanning<Type<&'a str>>,
311312
pub default_value: Option<Spanning<InputValue<S>>>,
312313
pub directives: Option<Vec<Spanning<Directive<'a, S>>>>,

juniper/src/parser/document.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,8 @@ fn parse_variable_definition<'a, S>(
440440
where
441441
S: ScalarValue,
442442
{
443+
let description = parse_description(parser)?;
444+
443445
let start_pos = parser.expect(&Token::Dollar)?.span.start;
444446
let var_name = parser.expect_name()?;
445447
parser.expect(&Token::Colon)?;
@@ -463,6 +465,7 @@ where
463465
(
464466
Spanning::start_end(&start_pos, &var_name.span.end, var_name.item),
465467
VariableDefinition {
468+
description,
466469
var_type,
467470
default_value,
468471
directives: directives.map(|s| s.item),

juniper/src/parser/tests/document.rs

Lines changed: 73 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,12 @@ fn description() {
127127
r#"
128128
"Some description with \u90AB symbol"
129129
query SomeOperation(
130-
#"ID you should provide"
130+
"ID you should provide and \u{90AB} symbol"
131131
$id: String
132-
#"Switch for experiment ...."
132+
"""
133+
Switch for experiment ....
134+
Multiline
135+
"""
133136
$enableBaz: Boolean = false
134137
) {
135138
foo(id: $id) {
@@ -152,7 +155,7 @@ fn description() {
152155
vec![
153156
ast::Definition::Operation(Spanning::start_end(
154157
&SourcePosition::new(71, 2, 16),
155-
&SourcePosition::new(479, 14, 17),
158+
&SourcePosition::new(567, 17, 17),
156159
ast::Operation {
157160
operation_type: ast::OperationType::Query,
158161
name: Some(Spanning::start_end(
@@ -167,19 +170,26 @@ fn description() {
167170
)),
168171
variable_definitions: Some(Spanning::start_end(
169172
&SourcePosition::new(90, 2, 35),
170-
&SourcePosition::new(276, 7, 17),
173+
&SourcePosition::new(364, 10, 17),
171174
ast::VariableDefinitions {
172175
items: vec![
173176
(
174177
Spanning::start_end(
175-
&SourcePosition::new(153, 4, 18),
176-
&SourcePosition::new(156, 4, 21),
178+
&SourcePosition::new(172, 4, 18),
179+
&SourcePosition::new(175, 4, 21),
177180
"id",
178181
),
179182
ast::VariableDefinition {
183+
description: Some(Spanning::start_end(
184+
&SourcePosition::new(110, 3, 18),
185+
&SourcePosition::new(153, 3, 61),
186+
Cow::Owned(
187+
"ID you should provide and \u{90AB} symbol".into(),
188+
),
189+
)),
180190
var_type: Spanning::start_end(
181-
&SourcePosition::new(158, 4, 23),
182-
&SourcePosition::new(164, 4, 29),
191+
&SourcePosition::new(177, 4, 23),
192+
&SourcePosition::new(183, 4, 29),
183193
ast::Type::nullable("String"),
184194
),
185195
default_value: None,
@@ -188,19 +198,24 @@ fn description() {
188198
),
189199
(
190200
Spanning::start_end(
191-
&SourcePosition::new(231, 6, 18),
192-
&SourcePosition::new(241, 6, 28),
201+
&SourcePosition::new(319, 9, 18),
202+
&SourcePosition::new(329, 9, 28),
193203
"enableBaz",
194204
),
195205
ast::VariableDefinition {
206+
description: Some(Spanning::start_end(
207+
&SourcePosition::new(202, 5, 18),
208+
&SourcePosition::new(300, 8, 21),
209+
Cow::Borrowed("Switch for experiment ....\nMultiline"),
210+
)),
196211
var_type: Spanning::start_end(
197-
&SourcePosition::new(243, 6, 30),
198-
&SourcePosition::new(250, 6, 37),
212+
&SourcePosition::new(331, 9, 30),
213+
&SourcePosition::new(338, 9, 37),
199214
ast::Type::nullable("Boolean"),
200215
),
201216
default_value: Some(Spanning::start_end(
202-
&SourcePosition::new(253, 6, 40),
203-
&SourcePosition::new(258, 6, 45),
217+
&SourcePosition::new(341, 9, 40),
218+
&SourcePosition::new(346, 9, 45),
204219
graphql::input_value!(false),
205220
)),
206221
directives: None,
@@ -211,28 +226,28 @@ fn description() {
211226
)),
212227
directives: None,
213228
selection_set: vec![ast::Selection::Field(Spanning::start_end(
214-
&SourcePosition::new(297, 8, 18),
215-
&SourcePosition::new(461, 13, 19),
229+
&SourcePosition::new(385, 11, 18),
230+
&SourcePosition::new(549, 16, 19),
216231
ast::Field {
217232
alias: None,
218233
name: Spanning::start_end(
219-
&SourcePosition::new(297, 8, 18),
220-
&SourcePosition::new(300, 8, 21),
234+
&SourcePosition::new(385, 11, 18),
235+
&SourcePosition::new(388, 11, 21),
221236
"foo",
222237
),
223238
arguments: Some(Spanning::start_end(
224-
&SourcePosition::new(300, 8, 21),
225-
&SourcePosition::new(309, 8, 30),
239+
&SourcePosition::new(388, 11, 21),
240+
&SourcePosition::new(397, 11, 30),
226241
ast::Arguments {
227242
items: vec![(
228243
Spanning::start_end(
229-
&SourcePosition::new(301, 8, 22),
230-
&SourcePosition::new(303, 8, 24),
244+
&SourcePosition::new(389, 11, 22),
245+
&SourcePosition::new(391, 11, 24),
231246
"id",
232247
),
233248
Spanning::start_end(
234-
&SourcePosition::new(305, 8, 26),
235-
&SourcePosition::new(308, 8, 29),
249+
&SourcePosition::new(393, 11, 26),
250+
&SourcePosition::new(396, 11, 29),
236251
graphql::input_value!(@id),
237252
),
238253
)],
@@ -241,13 +256,13 @@ fn description() {
241256
directives: None,
242257
selection_set: Some(vec![
243258
ast::Selection::Field(Spanning::start_end(
244-
&SourcePosition::new(332, 9, 20),
245-
&SourcePosition::new(335, 9, 23),
259+
&SourcePosition::new(420, 12, 20),
260+
&SourcePosition::new(423, 12, 23),
246261
ast::Field {
247262
alias: None,
248263
name: Spanning::start_end(
249-
&SourcePosition::new(332, 9, 20),
250-
&SourcePosition::new(335, 9, 23),
264+
&SourcePosition::new(420, 12, 20),
265+
&SourcePosition::new(423, 12, 23),
251266
"bar",
252267
),
253268
arguments: None,
@@ -256,38 +271,38 @@ fn description() {
256271
},
257272
)),
258273
ast::Selection::Field(Spanning::start_end(
259-
&SourcePosition::new(356, 10, 20),
260-
&SourcePosition::new(441, 12, 21),
274+
&SourcePosition::new(444, 13, 20),
275+
&SourcePosition::new(529, 15, 21),
261276
ast::Field {
262277
alias: None,
263278
name: Spanning::start_end(
264-
&SourcePosition::new(356, 10, 20),
265-
&SourcePosition::new(359, 10, 23),
279+
&SourcePosition::new(444, 13, 20),
280+
&SourcePosition::new(447, 13, 23),
266281
"baz",
267282
),
268283
arguments: None,
269284
directives: Some(vec![Spanning::start_end(
270-
&SourcePosition::new(360, 10, 24),
271-
&SourcePosition::new(384, 10, 48),
285+
&SourcePosition::new(448, 13, 24),
286+
&SourcePosition::new(472, 13, 48),
272287
ast::Directive {
273288
name: Spanning::start_end(
274-
&SourcePosition::new(361, 10, 25),
275-
&SourcePosition::new(368, 10, 32),
289+
&SourcePosition::new(449, 13, 25),
290+
&SourcePosition::new(456, 13, 32),
276291
"include",
277292
),
278293
arguments: Some(Spanning::start_end(
279-
&SourcePosition::new(368, 10, 32),
280-
&SourcePosition::new(384, 10, 48),
294+
&SourcePosition::new(456, 13, 32),
295+
&SourcePosition::new(472, 13, 48),
281296
ast::Arguments {
282297
items: vec![(
283298
Spanning::start_end(
284-
&SourcePosition::new(369, 10, 33),
285-
&SourcePosition::new(371, 10, 35),
299+
&SourcePosition::new(457, 13, 33),
300+
&SourcePosition::new(459, 13, 35),
286301
"if",
287302
),
288303
Spanning::start_end(
289-
&SourcePosition::new(373, 10, 37),
290-
&SourcePosition::new(383, 10, 47),
304+
&SourcePosition::new(461, 13, 37),
305+
&SourcePosition::new(471, 13, 47),
291306
graphql::input_value!(@enableBaz),
292307
),
293308
)],
@@ -297,12 +312,12 @@ fn description() {
297312
)]),
298313
selection_set: Some(vec![ast::Selection::FragmentSpread(
299314
Spanning::start_end(
300-
&SourcePosition::new(409, 11, 22),
301-
&SourcePosition::new(419, 11, 32),
315+
&SourcePosition::new(497, 14, 22),
316+
&SourcePosition::new(507, 14, 32),
302317
ast::FragmentSpread {
303318
name: Spanning::start_end(
304-
&SourcePosition::new(412, 11, 25),
305-
&SourcePosition::new(419, 11, 32),
319+
&SourcePosition::new(500, 14, 25),
320+
&SourcePosition::new(507, 14, 32),
306321
"BazInfo",
307322
),
308323
directives: None,
@@ -317,33 +332,33 @@ fn description() {
317332
},
318333
)),
319334
ast::Definition::Fragment(Spanning::start_end(
320-
&SourcePosition::new(607, 20, 16),
321-
&SourcePosition::new(679, 22, 17),
335+
&SourcePosition::new(695, 23, 16),
336+
&SourcePosition::new(767, 25, 17),
322337
ast::Fragment {
323338
name: Spanning::start_end(
324-
&SourcePosition::new(616, 20, 25),
325-
&SourcePosition::new(623, 20, 32),
339+
&SourcePosition::new(704, 23, 25),
340+
&SourcePosition::new(711, 23, 32),
326341
"BazInfo",
327342
),
328343
description: Some(Spanning::start_end(
329-
&SourcePosition::new(497, 16, 16),
330-
&SourcePosition::new(590, 19, 19),
344+
&SourcePosition::new(585, 19, 16),
345+
&SourcePosition::new(678, 22, 19),
331346
Cow::Borrowed("Some block description here\nMultiline"),
332347
)),
333348
type_condition: Spanning::start_end(
334-
&SourcePosition::new(627, 20, 36),
335-
&SourcePosition::new(630, 20, 39),
349+
&SourcePosition::new(715, 23, 36),
350+
&SourcePosition::new(718, 23, 39),
336351
"Baz",
337352
),
338353
directives: None,
339354
selection_set: vec![ast::Selection::Field(Spanning::start_end(
340-
&SourcePosition::new(653, 21, 20),
341-
&SourcePosition::new(661, 21, 28),
355+
&SourcePosition::new(741, 24, 20),
356+
&SourcePosition::new(749, 24, 28),
342357
ast::Field {
343358
alias: None,
344359
name: Spanning::start_end(
345-
&SourcePosition::new(653, 21, 20),
346-
&SourcePosition::new(661, 21, 28),
360+
&SourcePosition::new(741, 24, 20),
361+
&SourcePosition::new(749, 24, 28),
347362
"whatever",
348363
),
349364
arguments: None,

0 commit comments

Comments
 (0)