content: {-# LANGUAGE DataKinds #-}
  {-# LANGUAGE DeriveAnyClass #-}
  {-# LANGUAGE DeriveGeneric #-}
  {-# LANGUAGE DeriveLift #-}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE NoImplicitPrelude #-}
  
  module Data.Morpheus.Types.Internal.AST.OperationType
    ( OperationType (..),
      QUERY,
      MUTATION,
      SUBSCRIPTION,
      toOperationType,
      isOperationType,
    )
  where
  
  import Data.Morpheus.Rendering.RenderGQL
    ( RenderGQL (..),
    )
  import Data.Morpheus.Types.Internal.AST.Error (Msg (..))
  import Data.Morpheus.Types.Internal.AST.Name (TypeName)
  import Language.Haskell.TH.Syntax
    ( Lift,
    )
  import Relude hiding
    ( ByteString,
      Show,
      decodeUtf8,
      intercalate,
      show,
    )
  import Prelude (Show (..))
  
  type QUERY = 'OPERATION_QUERY
  
  type MUTATION = 'OPERATION_MUTATION
  
  type SUBSCRIPTION = 'OPERATION_SUBSCRIPTION
  
  data OperationType
    = OPERATION_QUERY
    | OPERATION_SUBSCRIPTION
    | OPERATION_MUTATION
    deriving
      ( Eq,
        Lift,
        Generic,
        Hashable,
        Show
      )
  
  instance RenderGQL OperationType where
    renderGQL OPERATION_QUERY = "query"
    renderGQL OPERATION_MUTATION = "mutation"
    renderGQL OPERATION_SUBSCRIPTION = "subscription"
  
  isOperationType :: OperationType -> TypeName -> Bool
  isOperationType OPERATION_QUERY "Query" = True
  isOperationType OPERATION_MUTATION "Mutation" = True
  isOperationType OPERATION_SUBSCRIPTION "Subscription" = True
  isOperationType _ _ = False
  {-# INLINE isOperationType #-}
  
  toOperationType :: TypeName -> Maybe OperationType
  toOperationType "Subscription" = Just OPERATION_SUBSCRIPTION
  toOperationType "Mutation" = Just OPERATION_MUTATION
  toOperationType "Query" = Just OPERATION_QUERY
  toOperationType _ = Nothing
  {-# INLINE toOperationType #-}
  
  instance Msg OperationType where
    msg OPERATION_QUERY = msg ("query" :: TypeName)
    msg OPERATION_MUTATION = msg ("mutation" :: TypeName)
    msg OPERATION_SUBSCRIPTION = msg ("subscription" :: TypeName)
  