{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE StandaloneDeriving #-}
module Data.Morpheus.CodeGen.Internal.Flags
( Flags,
Flag (..),
runCodeGenT,
CodeGenT,
langExtension,
requireExternal,
)
where
import Control.Monad.Except
import Data.Morpheus.Types.Internal.AST (GQLError)
import Data.Text
import Relude hiding (ByteString, get)
type Flags = [Flag]
data Flag
= FlagLanguageExtension Text
| FlagExternal Text
deriving (Ord, Eq, Show)
newtype CodeGenT ctx (m :: Type -> Type) a = CodeGenT
{ _runCodeGenT :: ReaderT ctx (StateT Flags m) a
}
deriving newtype
( Functor,
Applicative,
Monad,
MonadFail,
MonadReader ctx,
MonadState
Flags
)
deriving instance MonadError GQLError m => MonadError GQLError (CodeGenT ctx m)
instance MonadTrans (CodeGenT ctx) where
lift = CodeGenT . lift . lift
runCodeGenT :: Monad m => CodeGenT ctx m a -> ctx -> m (a, Flags)
runCodeGenT (CodeGenT m) ctx = runStateT (runReaderT m ctx) mempty
langExtension :: MonadState Flags m => Text -> m ()
langExtension ext = modify (FlagLanguageExtension ext :)
requireExternal :: MonadState Flags m => Text -> m ()
requireExternal ext = modify (FlagExternal ext :)