{- This Source Code Form is subject to the terms of the Mozilla Public License,
   v. 2.0. If a copy of the MPL was not distributed with this file, You can
   obtain one at https://mozilla.org/MPL/2.0/. -}

{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE ExplicitForAll #-}
{-# LANGUAGE NamedFieldPuns #-}

module Language.GraphQL.Execute.Internal
    ( addError
    , singleError
    ) where

import Control.Monad.Trans.State (modify)
import Control.Monad.Catch (MonadCatch)
import Data.Sequence ((|>))
import qualified Data.Text as Text
import qualified Language.GraphQL.AST as Full
import Language.GraphQL.Error (CollectErrsT, Error(..), Resolution(..))
import Prelude hiding (null)

addError :: MonadCatch m => forall a. a -> Error -> CollectErrsT m a
addError :: forall a. a -> Error -> CollectErrsT m a
addError a
returnValue Error
error' = (Resolution m -> Resolution m) -> StateT (Resolution m) m ()
forall (m :: * -> *) s. Monad m => (s -> s) -> StateT s m ()
modify Resolution m -> Resolution m
forall (m :: * -> *). Resolution m -> Resolution m
appender StateT (Resolution m) m ()
-> StateT (Resolution m) m a -> StateT (Resolution m) m a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> a -> StateT (Resolution m) m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
returnValue
  where
   appender :: Resolution m -> Resolution m
   appender :: Resolution m -> Resolution m
appender resolution :: Resolution m
resolution@Resolution{ Seq Error
$sel:errors:Resolution :: forall (m :: * -> *). Resolution m -> Seq Error
errors :: Seq Error
errors } = Resolution m
resolution
       { $sel:errors:Resolution :: Seq Error
errors = Seq Error
errors Seq Error -> Error -> Seq Error
forall a. Seq a -> a -> Seq a
|> Error
error'
       }

singleError :: [Full.Location] -> String -> Error
singleError :: [Location] -> String -> Error
singleError [Location]
errorLocations String
message = Text -> [Location] -> [Path] -> Error
Error (String -> Text
Text.pack String
message) [Location]
errorLocations []