{-# LANGUAGE OverloadedStrings #-}

module Data.Morpheus.Error.Internal
  ( internalTypeMismatch,
    internalError,
    internalResolvingError,
  )
where

-- MORPHEUS
import Data.Morpheus.Error.Utils (globalErrorMessage)
import Data.Morpheus.Types.Internal.AST.Base
  ( GQLErrors,
    Message,
    msg,
  )
import Data.Morpheus.Types.Internal.AST.Value
  ( ValidValue,
  )
import Data.Morpheus.Types.Internal.Resolving.Core
  ( Eventless,
    Failure (..),
  )
import Data.Semigroup ((<>))

-- GQL:: if no mutation defined -> "Schema is not configured for mutations."
-- all kind internal error in development
internalError :: Message -> Eventless a
internalError x = failure $ globalErrorMessage $ "INTERNAL ERROR: " <> x

internalResolvingError :: Message -> GQLErrors
internalResolvingError = globalErrorMessage . ("INTERNAL ERROR:" <>)

-- if value is already validated but value has different type
internalTypeMismatch :: Message -> ValidValue -> Eventless a
internalTypeMismatch text jsType =
  internalError $ "Type mismatch " <> text <> msg jsType