{-# LANGUAGE DeriveAnyClass    #-}
{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies      #-}
{-# LANGUAGE TypeOperators     #-}

module Data.Morpheus.Schema.Directive
  ( Directive(..)
  ) where

import           Data.Aeson                             (FromJSON (..))
import           Data.Morpheus.Kind                     (OBJECT)
import           Data.Morpheus.Schema.DirectiveLocation (DirectiveLocation)
import           Data.Morpheus.Schema.InputValue        (InputValue)
import           Data.Morpheus.Types.GQLType            (GQLType (KIND, __typeName, __typeVisibility))
import           Data.Text                              (Text)
import           Data.Typeable                          (Typeable)
import           GHC.Generics                           (Generic)

instance Typeable a => GQLType (Directive a) where
  type KIND (Directive a) = OBJECT
  __typeName = const "__Directive"
  __typeVisibility = const False

data Directive t = Directive
  { name        :: Text
  , description :: Maybe Text
  , locations   :: [DirectiveLocation]
  , args        :: [InputValue t]
  } deriving (Show, Generic, FromJSON)