content: {-# LANGUAGE DataKinds #-}
  {-# LANGUAGE DeriveAnyClass #-}
  {-# LANGUAGE DeriveGeneric #-}
  {-# LANGUAGE DuplicateRecordFields #-}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE TypeFamilies #-}
  
  module Feature.Directive.TypeVisitor
    ( api,
    )
  where
  
  import Data.Kind (Type)
  import Data.Morpheus.Server (interpreter)
  import Data.Morpheus.Server.Types
    ( Describe (..),
      GQLRequest,
      GQLResponse,
      GQLType (..),
      RootResolver (..),
      Undefined,
      defaultRootResolver,
      typeDirective,
    )
  import Data.Text (Text)
  import GHC.Generics (Generic)
  
  data Deity = Deity
    { name :: Text,
      power :: Maybe Text
    }
    deriving (Generic)
  
  instance GQLType Deity where
    directives _ = typeDirective Describe {text = "A supernatural being considered divine and sacred"}
  
  newtype Query (m :: Type -> Type) = Query {deity :: Deity}
    deriving (Generic, GQLType)
  
  root :: RootResolver IO () Query Undefined Undefined
  root =
    defaultRootResolver
      { queryResolver =
          Query
            { deity =
                Deity
                  { name = "morpheus",
                    power = Nothing
                  }
            }
      }
  
  api :: GQLRequest -> IO GQLResponse
  api = interpreter root
  