예제 #1
0
        /// <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;
                }
            }
        }