{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NoImplicitPrelude #-}

-- | GQL Types
module Data.Morpheus.Types
  ( GQLType
      ( KIND,
        description,
        getDescriptions,
        typeOptions,
        getDirectives,
        defaultValues,
        directives
      ),
    EncodeScalar (..),
    EncodeWrapper (..),
    DecodeScalar (..),
    DecodeWrapper (..),
    GQLRequest (..),
    GQLResponse (..),
    ID (..),
    ScalarValue (..),
    RootResolver (..),
    constRes,
    constMutRes,
    Undefined,
    Resolver,
    QUERY,
    MUTATION,
    SUBSCRIPTION,
    lift,
    liftEither,
    failRes,
    WithOperation,
    publish,
    subscribe,
    unsafeInternalContext,
    ResolverContext (..),
    ResolverO,
    ComposedResolver,
    ResolverQ,
    ResolverM,
    ResolverS,
    ResolveQ,
    ResolveM,
    ResolveS,
    Res,
    MutRes,
    SubRes,
    IORes,
    IOMutRes,
    IOSubRes,
    SubscriptionField,
    App,
    RenderGQL,
    render,
    TypeGuard (..),
    Arg (..),
    NamedResolvers (..),

    -- * GQLType naming configuration
    GQLTypeOptions,
    defaultTypeOptions,
    fieldLabelModifier,
    constructorTagModifier,
    typeNameModifier,
    defaultRootResolver,

    -- * GQL directives API
    Prefixes (..),
    VisitType (..),
    VisitField (..),
    Describe (..),
    VisitEnum (..),
    typeDirective,
    fieldDirective,
    enumDirective,

    -- * default GQL directives
    GQLDirective (..),
    Deprecated (..),
    dropNamespaceOptions,
    DropNamespace (..),
    Rename (..),
  )
where

import Control.Monad.Except (MonadError (..))
import Data.Morpheus.Server.Resolvers
import Data.Morpheus.Server.Types
  ( App,
    Arg (..),
    DecodeScalar (..),
    DecodeWrapper (..),
    Deprecated (..),
    Describe (..),
    DropNamespace (..),
    EncodeScalar (..),
    EncodeWrapper (..),
    GQLDirective (..),
    GQLRequest (..),
    GQLResponse (..),
    GQLType (..),
    GQLTypeOptions (..),
    ID (..),
    MUTATION,
    Prefixes (..),
    QUERY,
    Rename (..),
    RenderGQL,
    Resolver,
    ResolverContext (..),
    SUBSCRIPTION,
    ScalarValue (..),
    SubscriptionField,
    TypeGuard (..),
    Undefined,
    VisitEnum (..),
    VisitField (..),
    VisitType (..),
    WithOperation,
    defaultTypeOptions,
    dropNamespaceOptions,
    enumDirective,
    fieldDirective,
    render,
    subscribe,
    typeDirective,
    unsafeInternalContext,
  )
import Data.Morpheus.Types.Internal.AST (GQLError)
import Relude hiding (Undefined)

{-# DEPRECATED Res "use ResolverQ" #-}

type Res = Resolver QUERY

{-# DEPRECATED MutRes "use ResolverM" #-}

type MutRes = Resolver MUTATION

{-# DEPRECATED SubRes "use ResolverS" #-}

type SubRes = Resolver SUBSCRIPTION

{-# DEPRECATED IORes "use ResolverQ" #-}

type IORes e = Res e IO

{-# DEPRECATED IOMutRes "use ResolverM" #-}

type IOMutRes e = MutRes e IO

{-# DEPRECATED IOSubRes "use ResolverS" #-}

type IOSubRes e = SubRes e IO

{-# DEPRECATED ResolveQ "use ResolverQ" #-}

type ResolveQ e m a = ResolverQ e m a

{-# DEPRECATED ResolveM "use ResolverM" #-}

type ResolveM e m a = ResolverM e m a

{-# DEPRECATED ResolveS "use ResolverS" #-}

type ResolveS e m a = ResolverS e m a

constMutRes :: Monad m => [e] -> a -> args -> ResolverM e m a
constMutRes :: forall (m :: * -> *) e a args.
Monad m =>
[e] -> a -> args -> ResolverM e m a
constMutRes [e]
events a
v = forall a b. a -> b -> a
const forall a b. (a -> b) -> a -> b
$ do
  forall (m :: * -> *) e. Monad m => [e] -> Resolver MUTATION e m ()
publish [e]
events
  forall (f :: * -> *) a. Applicative f => a -> f a
pure a
v

{-# DEPRECATED failRes "use \"fail\" from \"MonadFail\"" #-}
failRes ::
  ( Monad m,
    WithOperation o
  ) =>
  String ->
  Resolver o e m a
failRes :: forall (m :: * -> *) (o :: OperationType) e a.
(Monad m, WithOperation o) =>
String -> Resolver o e m a
failRes = forall (m :: * -> *) a. MonadFail m => String -> m a
fail

liftEither :: (MonadTrans t, Monad (t m), MonadError GQLError (t m)) => Monad m => m (Either String a) -> t m a
liftEither :: forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad (t m), MonadError GQLError (t m), Monad m) =>
m (Either String a) -> t m a
liftEither m (Either String a)
x = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m (Either String a)
x forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. IsString a => String -> a
fromString) forall (f :: * -> *) a. Applicative f => a -> f a
pure