Skip to content

Commit 8e23158

Browse files
committed
support for repeatable on directives
1 parent 142d7dd commit 8e23158

File tree

2 files changed

+29
-11
lines changed

2 files changed

+29
-11
lines changed

Sources/GraphQL/Language/AST.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1684,19 +1684,22 @@ public final class DirectiveDefinition {
16841684
public let name: Name
16851685
public let arguments: [InputValueDefinition]
16861686
public let locations: [Name]
1687+
public let repeatable: Bool
16871688

16881689
init(
16891690
loc: Location? = nil,
16901691
description: StringValue? = nil,
16911692
name: Name,
16921693
arguments: [InputValueDefinition] = [],
1693-
locations: [Name]
1694+
locations: [Name],
1695+
repeatable: Bool = false
16941696
) {
16951697
self.loc = loc
16961698
self.name = name
16971699
self.description = description
16981700
self.arguments = arguments
16991701
self.locations = locations
1702+
self.repeatable = repeatable
17001703
}
17011704
}
17021705

Sources/GraphQL/Language/Parser.swift

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,7 +1190,7 @@ func parseInputObjectExtensionDefinition(lexer: Lexer) throws -> InputObjectExte
11901190

11911191
/**
11921192
* DirectiveDefinition :
1193-
* - directive @ Name ArgumentsDefinition? on DirectiveLocations
1193+
* - directive @ Name ArgumentsDefinition? repeatable? on DirectiveLocations
11941194
*/
11951195
func parseDirectiveDefinition(lexer: Lexer) throws -> DirectiveDefinition {
11961196
let start = lexer.token
@@ -1199,15 +1199,30 @@ func parseDirectiveDefinition(lexer: Lexer) throws -> DirectiveDefinition {
11991199
try expect(lexer: lexer, kind: .at)
12001200
let name = try parseName(lexer: lexer)
12011201
let args = try parseArgumentDefs(lexer: lexer)
1202-
try expectKeyword(lexer: lexer, value: "on")
1203-
let locations = try parseDirectiveLocations(lexer: lexer)
1204-
return DirectiveDefinition(
1205-
loc: loc(lexer: lexer, startToken: start),
1206-
description: description,
1207-
name: name,
1208-
arguments: args,
1209-
locations: locations
1210-
)
1202+
1203+
do {
1204+
try expectKeyword(lexer: lexer, value: "repeatable")
1205+
try expectKeyword(lexer: lexer, value: "on")
1206+
let locations = try parseDirectiveLocations(lexer: lexer)
1207+
return DirectiveDefinition(
1208+
loc: loc(lexer: lexer, startToken: start),
1209+
description: description,
1210+
name: name,
1211+
arguments: args,
1212+
locations: locations,
1213+
repeatable: true
1214+
)
1215+
} catch {
1216+
try expectKeyword(lexer: lexer, value: "on")
1217+
let locations = try parseDirectiveLocations(lexer: lexer)
1218+
return DirectiveDefinition(
1219+
loc: loc(lexer: lexer, startToken: start),
1220+
description: description,
1221+
name: name,
1222+
arguments: args,
1223+
locations: locations
1224+
)
1225+
}
12111226
}
12121227

12131228
/**

0 commit comments

Comments
 (0)