{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Data.GraphQL.Monad.Class (
MonadGraphQLQuery (..),
runQuery,
) where
import Control.Exception (throwIO)
import Control.Monad.IO.Class (MonadIO (..))
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Except (ExceptT)
import Control.Monad.Trans.Identity (IdentityT)
import Control.Monad.Trans.Maybe (MaybeT)
import qualified Control.Monad.Trans.RWS.Lazy as Lazy
import qualified Control.Monad.Trans.RWS.Strict as Strict
import Control.Monad.Trans.Reader (ReaderT)
import qualified Control.Monad.Trans.State.Lazy as Lazy
import qualified Control.Monad.Trans.State.Strict as Strict
import qualified Control.Monad.Trans.Writer.Lazy as Lazy
import qualified Control.Monad.Trans.Writer.Strict as Strict
import Data.Aeson.Schema (Object)
import Data.Maybe (fromJust)
import Data.GraphQL.Error (GraphQLException (..))
import Data.GraphQL.Query (GraphQLQuery (..))
import Data.GraphQL.Result (GraphQLResult, getErrors, getResult)
class (Monad m) => MonadGraphQLQuery m where
runQuerySafe ::
(GraphQLQuery query, schema ~ ResultSchema query) =>
query
-> m (GraphQLResult (Object schema))
runQuery ::
(MonadIO m, MonadGraphQLQuery m, GraphQLQuery query, schema ~ ResultSchema query) =>
query
-> m (Object schema)
runQuery :: forall (m :: * -> *) query (schema :: Schema).
(MonadIO m, MonadGraphQLQuery m, GraphQLQuery query,
schema ~ ResultSchema query) =>
query -> m (Object schema)
runQuery query
query = do
GraphQLResult (Object schema)
result <- forall (m :: * -> *) query (schema :: Schema).
(MonadGraphQLQuery m, GraphQLQuery query,
schema ~ ResultSchema query) =>
query -> m (GraphQLResult (Object schema))
runQuerySafe query
query
case forall r. GraphQLResult r -> [GraphQLError]
getErrors GraphQLResult (Object schema)
result of
[] -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. HasCallStack => Maybe a -> a
fromJust forall a b. (a -> b) -> a -> b
$ forall r. GraphQLResult r -> Maybe r
getResult GraphQLResult (Object schema)
result
[GraphQLError]
errors -> forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall e a. Exception e => e -> IO a
throwIO forall a b. (a -> b) -> a -> b
$ [GraphQLError] -> GraphQLException
GraphQLException [GraphQLError]
errors
instance (MonadGraphQLQuery m) => MonadGraphQLQuery (ReaderT r m) where
runQuerySafe :: forall query (schema :: Schema).
(GraphQLQuery query, schema ~ ResultSchema query) =>
query -> ReaderT r m (GraphQLResult (Object schema))
runQuerySafe = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) query (schema :: Schema).
(MonadGraphQLQuery m, GraphQLQuery query,
schema ~ ResultSchema query) =>
query -> m (GraphQLResult (Object schema))
runQuerySafe
instance (MonadGraphQLQuery m) => MonadGraphQLQuery (ExceptT e m) where
runQuerySafe :: forall query (schema :: Schema).
(GraphQLQuery query, schema ~ ResultSchema query) =>
query -> ExceptT e m (GraphQLResult (Object schema))
runQuerySafe = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) query (schema :: Schema).
(MonadGraphQLQuery m, GraphQLQuery query,
schema ~ ResultSchema query) =>
query -> m (GraphQLResult (Object schema))
runQuerySafe
instance (MonadGraphQLQuery m) => MonadGraphQLQuery (IdentityT m) where
runQuerySafe :: forall query (schema :: Schema).
(GraphQLQuery query, schema ~ ResultSchema query) =>
query -> IdentityT m (GraphQLResult (Object schema))
runQuerySafe = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) query (schema :: Schema).
(MonadGraphQLQuery m, GraphQLQuery query,
schema ~ ResultSchema query) =>
query -> m (GraphQLResult (Object schema))
runQuerySafe
instance (MonadGraphQLQuery m) => MonadGraphQLQuery (MaybeT m) where
runQuerySafe :: forall query (schema :: Schema).
(GraphQLQuery query, schema ~ ResultSchema query) =>
query -> MaybeT m (GraphQLResult (Object schema))
runQuerySafe = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) query (schema :: Schema).
(MonadGraphQLQuery m, GraphQLQuery query,
schema ~ ResultSchema query) =>
query -> m (GraphQLResult (Object schema))
runQuerySafe
instance (Monoid w, MonadGraphQLQuery m) => MonadGraphQLQuery (Lazy.RWST r w s m) where
runQuerySafe :: forall query (schema :: Schema).
(GraphQLQuery query, schema ~ ResultSchema query) =>
query -> RWST r w s m (GraphQLResult (Object schema))
runQuerySafe = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) query (schema :: Schema).
(MonadGraphQLQuery m, GraphQLQuery query,
schema ~ ResultSchema query) =>
query -> m (GraphQLResult (Object schema))
runQuerySafe
instance (Monoid w, MonadGraphQLQuery m) => MonadGraphQLQuery (Strict.RWST r w s m) where
runQuerySafe :: forall query (schema :: Schema).
(GraphQLQuery query, schema ~ ResultSchema query) =>
query -> RWST r w s m (GraphQLResult (Object schema))
runQuerySafe = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) query (schema :: Schema).
(MonadGraphQLQuery m, GraphQLQuery query,
schema ~ ResultSchema query) =>
query -> m (GraphQLResult (Object schema))
runQuerySafe
instance (MonadGraphQLQuery m) => MonadGraphQLQuery (Lazy.StateT s m) where
runQuerySafe :: forall query (schema :: Schema).
(GraphQLQuery query, schema ~ ResultSchema query) =>
query -> StateT s m (GraphQLResult (Object schema))
runQuerySafe = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) query (schema :: Schema).
(MonadGraphQLQuery m, GraphQLQuery query,
schema ~ ResultSchema query) =>
query -> m (GraphQLResult (Object schema))
runQuerySafe
instance (MonadGraphQLQuery m) => MonadGraphQLQuery (Strict.StateT s m) where
runQuerySafe :: forall query (schema :: Schema).
(GraphQLQuery query, schema ~ ResultSchema query) =>
query -> StateT s m (GraphQLResult (Object schema))
runQuerySafe = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) query (schema :: Schema).
(MonadGraphQLQuery m, GraphQLQuery query,
schema ~ ResultSchema query) =>
query -> m (GraphQLResult (Object schema))
runQuerySafe
instance (Monoid w, MonadGraphQLQuery m) => MonadGraphQLQuery (Lazy.WriterT w m) where
runQuerySafe :: forall query (schema :: Schema).
(GraphQLQuery query, schema ~ ResultSchema query) =>
query -> WriterT w m (GraphQLResult (Object schema))
runQuerySafe = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) query (schema :: Schema).
(MonadGraphQLQuery m, GraphQLQuery query,
schema ~ ResultSchema query) =>
query -> m (GraphQLResult (Object schema))
runQuerySafe
instance (Monoid w, MonadGraphQLQuery m) => MonadGraphQLQuery (Strict.WriterT w m) where
runQuerySafe :: forall query (schema :: Schema).
(GraphQLQuery query, schema ~ ResultSchema query) =>
query -> WriterT w m (GraphQLResult (Object schema))
runQuerySafe = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) query (schema :: Schema).
(MonadGraphQLQuery m, GraphQLQuery query,
schema ~ ResultSchema query) =>
query -> m (GraphQLResult (Object schema))
runQuerySafe