Skip to content

Commit e06f585

Browse files
committed
support for "deprecated" directive on enum values
1 parent 498fe39 commit e06f585

File tree

3 files changed

+80
-9
lines changed

3 files changed

+80
-9
lines changed

graphql_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,50 @@ func TestDeprecatedDirective(t *testing.T) {
519519
}
520520
`,
521521
},
522+
{
523+
Schema: graphql.MustParseSchema(`
524+
schema {
525+
query: Query
526+
}
527+
528+
type Query {
529+
}
530+
531+
enum Test {
532+
A
533+
B @deprecated
534+
C @deprecated(reason: "We don't like it")
535+
}
536+
`, &testDeprecatedDirectiveResolver{}),
537+
Query: `
538+
{
539+
__type(name: "Test") {
540+
enumValues {
541+
name
542+
}
543+
allEnumValues: enumValues(includeDeprecated: true) {
544+
name
545+
isDeprecated
546+
deprecationReason
547+
}
548+
}
549+
}
550+
`,
551+
ExpectedResult: `
552+
{
553+
"__type": {
554+
"enumValues": [
555+
{ "name": "A" }
556+
],
557+
"allEnumValues": [
558+
{ "name": "A", "isDeprecated": false, "deprecationReason": null },
559+
{ "name": "B", "isDeprecated": true, "deprecationReason": "No longer supported" },
560+
{ "name": "C", "isDeprecated": true, "deprecationReason": "We don't like it" }
561+
]
562+
}
563+
}
564+
`,
565+
},
522566
})
523567
}
524568

internal/schema/schema.go

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type Schema struct {
1818
entryPointNames map[string]string
1919
objects []*Object
2020
unions []*Union
21+
enums []*Enum
2122
}
2223

2324
func (s *Schema) Resolve(name string) common.Type {
@@ -68,8 +69,9 @@ type Enum struct {
6869
}
6970

7071
type EnumValue struct {
71-
Name string
72-
Desc string
72+
Name string
73+
Directives map[string]common.DirectiveArgs
74+
Desc string
7375
}
7476

7577
type InputObject struct {
@@ -208,6 +210,14 @@ func (s *Schema) Parse(schemaString string) error {
208210
}
209211
}
210212

213+
for _, enum := range s.enums {
214+
for _, value := range enum.Values {
215+
if err := resolveDirectives(s, value.Directives); err != nil {
216+
return err
217+
}
218+
}
219+
}
220+
211221
return nil
212222
}
213223

@@ -239,7 +249,14 @@ func resolveField(s *Schema, f *Field) error {
239249
return err
240250
}
241251
f.Type = t
242-
for name, args := range f.Directives {
252+
if err := resolveDirectives(s, f.Directives); err != nil {
253+
return err
254+
}
255+
return resolveInputObject(s, &f.Args)
256+
}
257+
258+
func resolveDirectives(s *Schema, directives map[string]common.DirectiveArgs) error {
259+
for name, args := range directives {
243260
d, ok := s.Directives[name]
244261
if !ok {
245262
return errors.Errorf("directive %q not found", name)
@@ -255,7 +272,7 @@ func resolveField(s *Schema, f *Field) error {
255272
}
256273
}
257274
}
258-
return resolveInputObject(s, &f.Args)
275+
return nil
259276
}
260277

261278
func resolveInputObject(s *Schema, io *common.InputMap) error {
@@ -300,6 +317,7 @@ func parseSchema(s *Schema, l *lexer.Lexer) {
300317
enum := parseEnumDecl(l)
301318
enum.Desc = desc
302319
s.Types[enum.Name] = enum
320+
s.enums = append(s.enums, enum)
303321
case "input":
304322
input := parseInputDecl(l)
305323
input.Desc = desc
@@ -378,6 +396,7 @@ func parseEnumDecl(l *lexer.Lexer) *Enum {
378396
v := &EnumValue{}
379397
v.Desc = l.DescComment()
380398
v.Name = l.ConsumeIdent()
399+
v.Directives = common.ParseDirectives(l)
381400
enum.Values = append(enum.Values, v)
382401
}
383402
l.ConsumeToken('}')

introspection/introspection.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,11 @@ func (r *Type) EnumValues(args *struct{ IncludeDeprecated bool }) *[]*EnumValue
162162
return nil
163163
}
164164

165-
l := make([]*EnumValue, len(t.Values))
166-
for i, v := range t.Values {
167-
l[i] = &EnumValue{v}
165+
var l []*EnumValue
166+
for _, v := range t.Values {
167+
if _, ok := v.Directives["deprecated"]; !ok || args.IncludeDeprecated {
168+
l = append(l, &EnumValue{v})
169+
}
168170
}
169171
return &l
170172
}
@@ -277,11 +279,17 @@ func (r *EnumValue) Description() *string {
277279
}
278280

279281
func (r *EnumValue) IsDeprecated() bool {
280-
return false
282+
_, ok := r.value.Directives["deprecated"]
283+
return ok
281284
}
282285

283286
func (r *EnumValue) DeprecationReason() *string {
284-
return nil
287+
args, ok := r.value.Directives["deprecated"]
288+
if !ok {
289+
return nil
290+
}
291+
reason := args["reason"].(string)
292+
return &reason
285293
}
286294

287295
type Directive struct {

0 commit comments

Comments
 (0)