/// <summary> /// Runs the specified visitor on the specified schema. This method traverses /// all the schema elements and calls the appropriate visitor methods. /// </summary> public static void Run(this ISchemaNodeVisitor visitor, ISchema schema) { visitor.VisitSchema(schema); foreach (var directive in schema.Directives.List) { visitor.VisitDirective(directive, schema); if (directive.Arguments?.Count > 0) { foreach (var argument in directive.Arguments.List !) { visitor.VisitDirectiveArgumentDefinition(argument, directive, schema); } } } foreach (var item in schema.AllTypes.Dictionary) { switch (item.Value) { case EnumerationGraphType e: visitor.VisitEnum(e, schema); foreach (var value in e.Values.List) // List is always non-null { visitor.VisitEnumValue(value, e, schema); } break; case ScalarGraphType scalar: visitor.VisitScalar(scalar, schema); break; case UnionGraphType union: visitor.VisitUnion(union, schema); break; case IInterfaceGraphType iface: visitor.VisitInterface(iface, schema); foreach (var field in iface.Fields.List) // List is always non-null { visitor.VisitInterfaceFieldDefinition(field, iface, schema); if (field.Arguments?.Count > 0) { foreach (var argument in field.Arguments.List !) { visitor.VisitInterfaceFieldArgumentDefinition(argument, field, iface, schema); } } } break; case IObjectGraphType output: visitor.VisitObject(output, schema); foreach (var field in output.Fields.List) // List is always non-null { visitor.VisitObjectFieldDefinition(field, output, schema); if (field.Arguments?.Count > 0) { foreach (var argument in field.Arguments.List !) { visitor.VisitObjectFieldArgumentDefinition(argument, field, output, schema); } } } break; case IInputObjectGraphType input: visitor.VisitInputObject(input, schema); foreach (var field in input.Fields.List) // List is always non-null { visitor.VisitInputObjectFieldDefinition(field, input, schema); } break; } } }