<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
declare(strict_types=1);

namespace Magento\Framework\GraphQl\Schema;

use Magento\Framework\GraphQl\Schema\Type\ObjectType;
use Magento\Framework\GraphQl\Schema\Type\InterfaceType;
use Magento\Framework\GraphQl\Schema\Type\InputObjectType;
use Magento\Framework\GraphQl\Schema\Type\EnumType;
use Magento\Framework\GraphQl\Schema\Type\ListOfType;
use Magento\Framework\GraphQl\Schema\Type\NonNull;
use Magento\Framework\GraphQl\Schema\Type\UnionType;

/**
 * Factory for @see TypeInterface implementations
 */
class TypeFactory
{
    /**
     * Create an object type
     *
     * @param array $config
     * @return ObjectType
     */
    public function createObject(array $config) : ObjectType
    {
        return new ObjectType($config);
    }

    /**
     * Create an interface type
     *
     * @param array $config
     * @return InterfaceType
     */
    public function createInterface(array $config) : InterfaceType
    {
        return new InterfaceType($config);
    }

    /**
     * Create an union type
     *
     * @param array $config
     * @return UnionType
     */
    public function createUnion(array $config) : UnionType
    {
        return new UnionType($config);
    }

    /**
     * Create an input object type
     *
     * @param array $config
     * @return InputObjectType
     */
    public function createInputObject(array $config) : InputObjectType
    {
        return new InputObjectType($config);
    }

    /**
     * Create an enum object type
     *
     * @param array $config
     * @return EnumType
     */
    public function createEnum(array $config) : EnumType
    {
        return new EnumType($config);
    }

    /**
     * Create an list array type
     *
     * @param TypeInterface $definedType
     * @return ListOfType
     */
    public function createList(TypeInterface $definedType) : ListOfType
    {
        return new ListOfType($definedType);
    }

    /**
     * Create a non null type
     *
     * @param TypeInterface $definedType
     * @return NonNull
     */
    public function createNonNull(TypeInterface $definedType) : NonNull
    {
        return new NonNull($definedType);
    }
}
