<?php
/**
 * Autogenerated file by axtiva/flexible-graphql-php Do not edit it manually
 */ 
namespace Axtiva\FlexibleGraphql\Example\GraphQL;

use GraphQL\Type\Definition\Type;
use GraphQL\Type\Definition\InterfaceType;
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\ListOfType;
use GraphQL\Type\Definition\NonNull;
use Axtiva\FlexibleGraphql\Type\EnumType;
use GraphQL\Type\Definition\InputObjectType;
use GraphQL\Type\Definition\CustomScalarType;
use GraphQL\Type\Definition\UnionType;
use GraphQL\Type\Definition\Directive;
use GraphQL\Type\Definition\Argument;
use GraphQL\Type\Definition\FieldDefinition;
use GraphQL\Type\Definition\InputObjectField;
use Psr\Container\ContainerInterface;
use GraphQL\Type\Schema;

class TypeRegistry
{
    private ContainerInterface $container;
    
    /**
     * @var array<string, Type>
     */
    private array $types = [];
    
    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    public function getType(string $name): Type
    {
        return $this->types[$name] ??= $this->{$name}();
    }
    
    
            public function FieldSet()
            {
                return new CustomScalarType([
            'name' => 'FieldSet',
            'description' => NULL,

        ]);
            }
        


            public function Query()
            {
                return new ObjectType([
            'name' => 'Query',
            'description' => NULL,
            'fields' => fn() => ['account' => new FieldDefinition([
            'name' => 'account',
            'description' => NULL,
            'deprecationReason' => NULL,
            'resolve' => (function ($rootValue, $args, $context, $info) {
    $args = new \Axtiva\FlexibleGraphql\Example\GraphQL\ResolverArgs\Query\AccountResolverArgs($args);
    return $this->container->get('Axtiva\FlexibleGraphql\Example\GraphQL\Resolver\Query\AccountResolver')($rootValue, $args, $context, $info);
}),
            'type' => function() { return $this->getType('Account'); },
            'args' => ['id' => [
            'name' => 'id',
            'type' => function() { return Type::nonNull(function() { return Type::id(); }); },
            'defaultValue' => NULL,
            'description' => NULL,
        ]],
        ]),'sum' => new FieldDefinition([
            'name' => 'sum',
            'description' => NULL,
            'deprecationReason' => NULL,
            'resolve' => function($rootValue, $args, $context, $info) {
                        return $this->container->get('Axtiva\FlexibleGraphql\Example\GraphQL\Directive\PlusXDirective')(
                        (function ($rootValue, $args, $context, $info) {
    
    return $this->container->get('Axtiva\FlexibleGraphql\Example\GraphQL\Resolver\Query\SumResolver')($rootValue, $args, $context, $info);
}), 
                        new \Axtiva\FlexibleGraphql\Example\GraphQL\DirectiveArgs\PlusXDirectiveArgs(array (
  'x' => '7',
)),
                        $rootValue, $args, $context, $info
                        );
                    },
            'type' => function() { return Type::int(); },
            'args' => [],
        ]),'dynamicSum' => new FieldDefinition([
            'name' => 'dynamicSum',
            'description' => NULL,
            'deprecationReason' => NULL,
            'resolve' => function($rootValue, $args, $context, $info) {
                        return $this->container->get('Axtiva\FlexibleGraphql\Example\GraphQL\Directive\PlusXDirective')(
                        (function ($rootValue, $args, $context, $info) {
    $args = new \Axtiva\FlexibleGraphql\Example\GraphQL\ResolverArgs\Query\DynamicSumResolverArgs($args);
    return $this->container->get('Axtiva\FlexibleGraphql\Example\GraphQL\Resolver\Query\DynamicSumResolver')($rootValue, $args, $context, $info);
}), 
                        new \Axtiva\FlexibleGraphql\Example\GraphQL\DirectiveArgs\PlusXDirectiveArgs(array (
  'x' => '4',
)),
                        $rootValue, $args, $context, $info
                        );
                    },
            'type' => function() { return Type::int(); },
            'args' => ['x' => [
            'name' => 'x',
            'type' => function() { return Type::nonNull(function() { return Type::int(); }); },
            'defaultValue' => NULL,
            'description' => NULL,
        ],'y' => [
            'name' => 'y',
            'type' => function() { return Type::nonNull(function() { return Type::int(); }); },
            'defaultValue' => NULL,
            'description' => NULL,
        ]],
        ]),'addHour' => new FieldDefinition([
            'name' => 'addHour',
            'description' => NULL,
            'deprecationReason' => NULL,
            'resolve' => (function ($rootValue, $args, $context, $info) {
    $args = new \Axtiva\FlexibleGraphql\Example\GraphQL\ResolverArgs\Query\AddHourResolverArgs($args);
    return $this->container->get('Axtiva\FlexibleGraphql\Example\GraphQL\Resolver\Query\AddHourResolver')($rootValue, $args, $context, $info);
}),
            'type' => function() { return $this->getType('DateTime'); },
            'args' => ['date' => [
            'name' => 'date',
            'type' => function() { return Type::nonNull(function() { return $this->getType('DateTime'); }); },
            'defaultValue' => NULL,
            'description' => NULL,
        ]],
        ]),'_service' => new FieldDefinition([
            'name' => '_service',
            'description' => NULL,
            'deprecationReason' => NULL,
            'resolve' => (function ($rootValue, $args, $context, $info) {
    
    return $this->container->get('Axtiva\FlexibleGraphql\Example\GraphQL\Resolver\Query\_ServiceResolver')($rootValue, $args, $context, $info);
}),
            'type' => function() { return Type::nonNull(function() { return $this->getType('_Service'); }); },
            'args' => [],
        ]),'_entities' => new FieldDefinition([
            'name' => '_entities',
            'description' => NULL,
            'deprecationReason' => NULL,
            'resolve' => (function ($rootValue, $args, $context, $info) {
    $args = new \Axtiva\FlexibleGraphql\Example\GraphQL\ResolverArgs\Query\_EntitiesResolverArgs($args);
    return $this->container->get('Axtiva\FlexibleGraphql\Example\GraphQL\Resolver\Query\_EntitiesResolver')($rootValue, $args, $context, $info);
}),
            'type' => function() { return Type::nonNull(function() { return new ListOfType(function() { return $this->getType('_Entity'); }); }); },
            'args' => ['representations' => [
            'name' => 'representations',
            'type' => function() { return Type::nonNull(function() { return new ListOfType(function() { return Type::nonNull(function() { return $this->getType('_Any'); }); }); }); },
            'defaultValue' => NULL,
            'description' => NULL,
        ]],
        ])],
        ]);
            }
        


            public function Node()
            {
                return new InterfaceType([
            'name' => 'Node',
            'description' => NULL,
            'fields' => fn() => ['id' => new FieldDefinition([
            'name' => 'id',
            'description' => NULL,
            'deprecationReason' => NULL,
            // No resolver. Default used
            'type' => function() { return Type::nonNull(function() { return Type::id(); }); },
            'args' => [],
        ])],
        ]);
            }
        


            public function Account()
            {
                return new ObjectType([
            'name' => 'Account',
            'description' => NULL,
            'fields' => fn() => ['id' => new FieldDefinition([
            'name' => 'id',
            'description' => NULL,
            'deprecationReason' => NULL,
            // No resolver. Default used
            'type' => function() { return Type::nonNull(function() { return Type::id(); }); },
            'args' => [],
        ]),'number' => new FieldDefinition([
            'name' => 'number',
            'description' => NULL,
            'deprecationReason' => NULL,
            'resolve' => function($rootValue, $args, $context, $info) {
                        return $this->container->get('Axtiva\FlexibleGraphql\Example\GraphQL\Directive\UppercaseDirective')(
                        \Axtiva\FlexibleGraphql\Resolver\Foundation\DefaultResolver::getInstance(), 
                        array (
),
                        $rootValue, $args, $context, $info
                        );
                    },
            'type' => function() { return Type::nonNull(function() { return Type::string(); }); },
            'args' => [],
        ]),'currency' => new FieldDefinition([
            'name' => 'currency',
            'description' => NULL,
            'deprecationReason' => NULL,
            // No resolver. Default used
            'type' => function() { return Type::nonNull(function() { return $this->getType('Currency'); }); },
            'args' => [],
        ]),'transactions' => new FieldDefinition([
            'name' => 'transactions',
            'description' => NULL,
            'deprecationReason' => NULL,
            'resolve' => (function ($rootValue, $args, $context, $info) {
    
    return $this->container->get('Axtiva\FlexibleGraphql\Example\GraphQL\Resolver\Account\TransactionsResolver')($rootValue, $args, $context, $info);
}),
            'type' => function() { return Type::nonNull(function() { return new ListOfType(function() { return Type::nonNull(function() { return $this->getType('Transaction'); }); }); }); },
            'args' => [],
        ])],
        ]);
            }
        


            public function Transaction()
            {
                return new ObjectType([
            'name' => 'Transaction',
            'description' => NULL,
            'fields' => fn() => ['id' => new FieldDefinition([
            'name' => 'id',
            'description' => NULL,
            'deprecationReason' => NULL,
            // No resolver. Default used
            'type' => function() { return Type::nonNull(function() { return Type::id(); }); },
            'args' => [],
        ]),'amount' => new FieldDefinition([
            'name' => 'amount',
            'description' => NULL,
            'deprecationReason' => NULL,
            // No resolver. Default used
            'type' => function() { return Type::nonNull(function() { return Type::int(); }); },
            'args' => [],
        ]),'ups' => new FieldDefinition([
            'name' => 'ups',
            'description' => NULL,
            'deprecationReason' => NULL,
            // No resolver. Default used
            'type' => function() { return Type::string(); },
            'args' => [],
        ]),'createdAt' => new FieldDefinition([
            'name' => 'createdAt',
            'description' => NULL,
            'deprecationReason' => NULL,
            // No resolver. Default used
            'type' => function() { return $this->getType('DateTime'); },
            'args' => [],
        ]),'status' => new FieldDefinition([
            'name' => 'status',
            'description' => NULL,
            'deprecationReason' => NULL,
            'resolve' => (function ($rootValue, $args, $context, $info) {
    
    return $this->container->get('Axtiva\FlexibleGraphql\Example\GraphQL\Resolver\Transaction\StatusResolver')($rootValue, $args, $context, $info);
}),
            'type' => function() { return Type::nonNull(function() { return $this->getType('TransactionStatus'); }); },
            'args' => [],
        ])],
        ]);
            }
        


            public function NamedCurrency()
            {
                return new ObjectType([
            'name' => 'NamedCurrency',
            'description' => NULL,
            'fields' => fn() => ['id' => new FieldDefinition([
            'name' => 'id',
            'description' => NULL,
            'deprecationReason' => NULL,
            // No resolver. Default used
            'type' => function() { return Type::nonNull(function() { return Type::id(); }); },
            'args' => [],
        ]),'name' => new FieldDefinition([
            'name' => 'name',
            'description' => NULL,
            'deprecationReason' => NULL,
            // No resolver. Default used
            'type' => function() { return Type::nonNull(function() { return Type::string(); }); },
            'args' => [],
        ])],
        ]);
            }
        


            public function CodedCurrency()
            {
                return new ObjectType([
            'name' => 'CodedCurrency',
            'description' => NULL,
            'fields' => fn() => ['id' => new FieldDefinition([
            'name' => 'id',
            'description' => NULL,
            'deprecationReason' => NULL,
            // No resolver. Default used
            'type' => function() { return Type::nonNull(function() { return Type::id(); }); },
            'args' => [],
        ]),'code' => new FieldDefinition([
            'name' => 'code',
            'description' => NULL,
            'deprecationReason' => NULL,
            // No resolver. Default used
            'type' => function() { return Type::nonNull(function() { return Type::int(); }); },
            'args' => [],
        ])],
        ]);
            }
        


            public function Currency()
            {
                return new UnionType([
            'name' => 'Currency',
            'description' => NULL,
            'types' => function() { return [$this->getType('NamedCurrency'),$this->getType('CodedCurrency')];},
            'resolveType' => $this->container->get('Axtiva\FlexibleGraphql\Example\GraphQL\UnionResolveType\CurrencyTypeResolver'),
        ]);
            }
        


            public function TransactionStatus()
            {
                return new EnumType([
        'name' => 'TransactionStatus',
        'description' => 'TRANSACTION STATUS DOC',
        'values' => ['NEW' => [
            'name' => 'NEW', 
            'value' => 'NEW',
            'description' => NULL,
            'deprecationReason' => NULL,
            ],
'SUCCESS' => [
            'name' => 'SUCCESS', 
            'value' => 'SUCCESS',
            'description' => 'SUCCESS DOC',
            'deprecationReason' => NULL,
            ],
'FAIL' => [
            'name' => 'FAIL', 
            'value' => 'FAIL',
            'description' => NULL,
            'deprecationReason' => NULL,
            ]],
        ]);
            }
        


            public function DateTime()
            {
                return new CustomScalarType([
            'name' => 'DateTime',
            'description' => NULL,
            'serialize' => function($value) {return ($this->container->get('Axtiva\FlexibleGraphql\Example\GraphQL\Scalar\DateTimeScalar'))->serialize($value);},
            'parseValue' => function($value) {return ($this->container->get('Axtiva\FlexibleGraphql\Example\GraphQL\Scalar\DateTimeScalar'))->parseValue($value);},
            'parseLiteral' => function($value, $variables) {return ($this->container->get('Axtiva\FlexibleGraphql\Example\GraphQL\Scalar\DateTimeScalar'))->parseLiteral($value, $variables);},
        ]);
            }
        


            public function HelloWorld()
            {
                return new CustomScalarType([
            'name' => 'HelloWorld',
            'description' => NULL,

        ]);
            }
        


            public function _FieldSet()
            {
                return new CustomScalarType([
            'name' => '_FieldSet',
            'description' => NULL,

        ]);
            }
        


            public function _Service()
            {
                return new ObjectType([
            'name' => '_Service',
            'description' => NULL,
            'fields' => fn() => ['sdl' => new FieldDefinition([
            'name' => 'sdl',
            'description' => NULL,
            'deprecationReason' => NULL,
            // No resolver. Default used
            'type' => function() { return Type::nonNull(function() { return Type::string(); }); },
            'args' => [],
        ])],
        ]);
            }
        


            public function _Entity()
            {
                return new UnionType([
            'name' => '_Entity',
            'description' => NULL,
            'types' => function() { return [$this->getType('Account'),$this->getType('Transaction')];},
            'resolveType' => $this->container->get('Axtiva\FlexibleGraphql\Example\GraphQL\UnionResolveType\_EntityTypeResolver'),
        ]);
            }
        


            public function _Any()
            {
                return new CustomScalarType([
            'name' => '_Any',
            'description' => NULL,

        ]);
            }
        


            public function link__Purpose()
            {
                return new EnumType([
        'name' => 'link__Purpose',
        'description' => NULL,
        'values' => ['SECURITY' => [
            'name' => 'SECURITY', 
            'value' => 'SECURITY',
            'description' => '`SECURITY` features provide metadata necessary to securely resolve fields.',
            'deprecationReason' => NULL,
            ],
'EXECUTION' => [
            'name' => 'EXECUTION', 
            'value' => 'EXECUTION',
            'description' => '`EXECUTION` features provide metadata necessary for operation execution.',
            'deprecationReason' => NULL,
            ]],
        ]);
            }
        


            public function link__Import()
            {
                return new CustomScalarType([
            'name' => 'link__Import',
            'description' => NULL,

        ]);
            }
        

    public function Mutation()
    {
        return new ObjectType(['name' => 'Mutation']);
    }


    public function directive_uppercase()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'uppercase',
            'description' => 'CAPITALIZE ALL LETTERS IN STRING',
            'isRepeatable' => false,
            'locations' => ['FIELD','FIELD_DEFINITION'],
            'args' => [
                
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_plusX()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'plusX',
            'description' => NULL,
            'isRepeatable' => false,
            'locations' => ['FIELD','FIELD_DEFINITION'],
            'args' => [
                [
            'name' => 'x',
            'type' => function() { return Type::nonNull(function() { return Type::int(); }); },
            'defaultValue' => NULL,
            'description' => NULL,
        ]
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_key()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'key',
            'description' => NULL,
            'isRepeatable' => true,
            'locations' => ['OBJECT','INTERFACE'],
            'args' => [
                [
            'name' => 'fields',
            'type' => function() { return Type::nonNull(function() { return $this->getType('FieldSet'); }); },
            'defaultValue' => NULL,
            'description' => NULL,
        ],[
            'name' => 'resolvable',
            'type' => function() { return Type::boolean(); },
            'defaultValue' => true,
            'description' => NULL,
        ]
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_external()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'external',
            'description' => NULL,
            'isRepeatable' => false,
            'locations' => ['FIELD_DEFINITION'],
            'args' => [
                
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_requires()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'requires',
            'description' => NULL,
            'isRepeatable' => false,
            'locations' => ['FIELD_DEFINITION'],
            'args' => [
                [
            'name' => 'fields',
            'type' => function() { return Type::nonNull(function() { return $this->getType('FieldSet'); }); },
            'defaultValue' => NULL,
            'description' => NULL,
        ]
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_provides()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'provides',
            'description' => NULL,
            'isRepeatable' => false,
            'locations' => ['FIELD_DEFINITION'],
            'args' => [
                [
            'name' => 'fields',
            'type' => function() { return Type::nonNull(function() { return $this->getType('FieldSet'); }); },
            'defaultValue' => NULL,
            'description' => NULL,
        ]
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_extends()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'extends',
            'description' => NULL,
            'isRepeatable' => false,
            'locations' => ['OBJECT','INTERFACE'],
            'args' => [
                
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_link()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'link',
            'description' => NULL,
            'isRepeatable' => true,
            'locations' => ['SCHEMA'],
            'args' => [
                [
            'name' => 'url',
            'type' => function() { return Type::string(); },
            'defaultValue' => NULL,
            'description' => NULL,
        ],[
            'name' => 'as',
            'type' => function() { return Type::string(); },
            'defaultValue' => NULL,
            'description' => NULL,
        ],[
            'name' => 'for',
            'type' => function() { return $this->getType('link__Purpose'); },
            'defaultValue' => NULL,
            'description' => NULL,
        ],[
            'name' => 'import',
            'type' => function() { return new ListOfType(function() { return $this->getType('link__Import'); }); },
            'defaultValue' => NULL,
            'description' => NULL,
        ]
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_shareable()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'shareable',
            'description' => NULL,
            'isRepeatable' => false,
            'locations' => ['OBJECT','FIELD_DEFINITION'],
            'args' => [
                
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_inaccessible()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'inaccessible',
            'description' => NULL,
            'isRepeatable' => false,
            'locations' => ['FIELD_DEFINITION','OBJECT','INTERFACE','UNION','ARGUMENT_DEFINITION','SCALAR','ENUM','ENUM_VALUE','INPUT_OBJECT','INPUT_FIELD_DEFINITION'],
            'args' => [
                
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_override()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'override',
            'description' => NULL,
            'isRepeatable' => false,
            'locations' => ['FIELD_DEFINITION'],
            'args' => [
                [
            'name' => 'from',
            'type' => function() { return Type::nonNull(function() { return Type::string(); }); },
            'defaultValue' => NULL,
            'description' => NULL,
        ]
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_tag()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'tag',
            'description' => NULL,
            'isRepeatable' => true,
            'locations' => ['FIELD_DEFINITION','INTERFACE','OBJECT','UNION','ARGUMENT_DEFINITION','SCALAR','ENUM','ENUM_VALUE','INPUT_OBJECT','INPUT_FIELD_DEFINITION'],
            'args' => [
                [
            'name' => 'name',
            'type' => function() { return Type::nonNull(function() { return Type::string(); }); },
            'defaultValue' => NULL,
            'description' => NULL,
        ]
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_federation__tag()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'federation__tag',
            'description' => NULL,
            'isRepeatable' => true,
            'locations' => ['FIELD_DEFINITION','INTERFACE','OBJECT','UNION','ARGUMENT_DEFINITION','SCALAR','ENUM','ENUM_VALUE','INPUT_OBJECT','INPUT_FIELD_DEFINITION'],
            'args' => [
                [
            'name' => 'name',
            'type' => function() { return Type::nonNull(function() { return Type::string(); }); },
            'defaultValue' => NULL,
            'description' => NULL,
        ]
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_federation__shareable()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'federation__shareable',
            'description' => NULL,
            'isRepeatable' => false,
            'locations' => ['OBJECT','FIELD_DEFINITION'],
            'args' => [
                
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_federation__inaccessible()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'federation__inaccessible',
            'description' => NULL,
            'isRepeatable' => false,
            'locations' => ['FIELD_DEFINITION','OBJECT','INTERFACE','UNION','ARGUMENT_DEFINITION','SCALAR','ENUM','ENUM_VALUE','INPUT_OBJECT','INPUT_FIELD_DEFINITION'],
            'args' => [
                
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_federation__override()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'federation__override',
            'description' => NULL,
            'isRepeatable' => false,
            'locations' => ['FIELD_DEFINITION'],
            'args' => [
                [
            'name' => 'from',
            'type' => function() { return Type::nonNull(function() { return Type::string(); }); },
            'defaultValue' => NULL,
            'description' => NULL,
        ]
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_federation__external()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'federation__external',
            'description' => NULL,
            'isRepeatable' => false,
            'locations' => ['FIELD_DEFINITION'],
            'args' => [
                
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_federation__requires()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'federation__requires',
            'description' => NULL,
            'isRepeatable' => false,
            'locations' => ['FIELD_DEFINITION'],
            'args' => [
                [
            'name' => 'fields',
            'type' => function() { return Type::nonNull(function() { return $this->getType('FieldSet'); }); },
            'defaultValue' => NULL,
            'description' => NULL,
        ]
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_federation__provides()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'federation__provides',
            'description' => NULL,
            'isRepeatable' => false,
            'locations' => ['FIELD_DEFINITION'],
            'args' => [
                [
            'name' => 'fields',
            'type' => function() { return Type::nonNull(function() { return $this->getType('FieldSet'); }); },
            'defaultValue' => NULL,
            'description' => NULL,
        ]
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_federation__key()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'federation__key',
            'description' => NULL,
            'isRepeatable' => true,
            'locations' => ['OBJECT','INTERFACE'],
            'args' => [
                [
            'name' => 'fields',
            'type' => function() { return Type::nonNull(function() { return $this->getType('FieldSet'); }); },
            'defaultValue' => NULL,
            'description' => NULL,
        ],[
            'name' => 'resolvable',
            'type' => function() { return Type::boolean(); },
            'defaultValue' => true,
            'description' => NULL,
        ]
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function directive_federation__extends()
    {
        static $directive = null;
        if ($directive === null) {
            $directive = new Directive([
            'name' => 'federation__extends',
            'description' => NULL,
            'isRepeatable' => false,
            'locations' => ['OBJECT','INTERFACE'],
            'args' => [
                
            ],
        ]);
        }
        
        return $directive;
    }
        


    public function getDirectives()
    {
        return [$this->directive_uppercase(),$this->directive_plusX(),$this->directive_key(),$this->directive_external(),$this->directive_requires(),$this->directive_provides(),$this->directive_extends(),$this->directive_link(),$this->directive_shareable(),$this->directive_inaccessible(),$this->directive_override(),$this->directive_tag(),$this->directive_federation__tag(),$this->directive_federation__shareable(),$this->directive_federation__inaccessible(),$this->directive_federation__override(),$this->directive_federation__external(),$this->directive_federation__requires(),$this->directive_federation__provides(),$this->directive_federation__key(),$this->directive_federation__extends()];
    }
        

}
