<?php

declare (strict_types=1);
namespace PoP\ComponentModel\FieldResolvers\InterfaceType;

use PoP\ComponentModel\FieldResolvers\FieldResolverInterface;
use PoP\ComponentModel\TypeResolvers\InterfaceType\InterfaceTypeResolverInterface;
/** @internal */
interface InterfaceTypeFieldResolverInterface extends FieldResolverInterface, \PoP\ComponentModel\FieldResolvers\InterfaceType\InterfaceTypeFieldSchemaDefinitionResolverInterface
{
    /**
     * The classes of the InterfaceTypeResolvers this InterfaceTypeFieldResolver adds fields to.
     * The list can contain both concrete and abstract classes (in which case all classes
     * extending from them will be selected)
     *
     * @return array<class-string<InterfaceTypeResolverInterface>>
     */
    public function getInterfaceTypeResolverClassesToAttachTo() : array;
    /**
     * Get an array with the fieldNames that the fieldResolver must implement
     *
     * @return string[]
     */
    public function getFieldNamesToImplement() : array;
    /**
     * Each InterfaceTypeFieldResolver provides a list of fieldNames to the Interface.
     * The Interface may also accept other fieldNames from other InterfaceTypeFieldResolvers.
     * That's why this function is "partially" implemented: the Interface
     * may be completely implemented or not.
     *
     * @return InterfaceTypeResolverInterface[]
     */
    public function getPartiallyImplementedInterfaceTypeResolvers() : array;
    public function skipExposingFieldInSchema(string $fieldName) : bool;
    /**
     * @return array<string,mixed>
     */
    public function getFieldSchemaDefinition(string $fieldName) : array;
}
