{-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE NoImplicitPrelude #-} module Data.Morpheus.App.SchemaAPI ( withSystemFields, ) where import Data.Morpheus.App.Internal.Resolving ( Resolver, ResolverValue, ResultT, RootResolverValue (..), mkList, mkNull, mkObject, withArguments, ) import Data.Morpheus.App.RenderIntrospection ( WithSchema, createObjectType, render, ) import Data.Morpheus.Internal.Ext ((<:>)) import Data.Morpheus.Internal.Utils ( elems, empty, selectOr, ) import Data.Morpheus.Types.Internal.AST ( Argument (..), FieldName, OBJECT, QUERY, ScalarValue (..), Schema (..), TypeDefinition (..), TypeName (..), VALID, Value (..), ) import Relude hiding (empty) resolveTypes :: (Monad m, WithSchema m) => Schema VALID -> m (ResolverValue m) resolveTypes :: Schema VALID -> m (ResolverValue m) resolveTypes Schema VALID schema = [ResolverValue m] -> ResolverValue m forall (m :: * -> *). [ResolverValue m] -> ResolverValue m mkList ([ResolverValue m] -> ResolverValue m) -> m [ResolverValue m] -> m (ResolverValue m) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> (TypeDefinition ANY VALID -> m (ResolverValue m)) -> [TypeDefinition ANY VALID] -> m [ResolverValue m] forall (t :: * -> *) (f :: * -> *) a b. (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b) traverse TypeDefinition ANY VALID -> m (ResolverValue m) forall a (m :: * -> *). (RenderIntrospection a, Monad m, WithSchema m) => a -> m (ResolverValue m) render (Schema VALID -> [TypeDefinition ANY VALID] forall a coll. Elems a coll => coll -> [a] elems Schema VALID schema) renderOperation :: (Monad m, WithSchema m) => Maybe (TypeDefinition OBJECT VALID) -> m (ResolverValue m) renderOperation :: Maybe (TypeDefinition OBJECT VALID) -> m (ResolverValue m) renderOperation (Just TypeDefinition {TypeName typeName :: forall (a :: TypeCategory) (s :: Stage). TypeDefinition a s -> TypeName typeName :: TypeName typeName}) = ResolverValue m -> m (ResolverValue m) forall (f :: * -> *) a. Applicative f => a -> f a pure (ResolverValue m -> m (ResolverValue m)) -> ResolverValue m -> m (ResolverValue m) forall a b. (a -> b) -> a -> b $ TypeName -> Maybe Description -> [TypeName] -> FieldsDefinition OUT VALID -> ResolverValue m forall (m :: * -> *). (Monad m, WithSchema m) => TypeName -> Maybe Description -> [TypeName] -> FieldsDefinition OUT VALID -> ResolverValue m createObjectType TypeName typeName Maybe Description forall a. Maybe a Nothing [] FieldsDefinition OUT VALID forall coll. Empty coll => coll empty renderOperation Maybe (TypeDefinition OBJECT VALID) Nothing = ResolverValue m -> m (ResolverValue m) forall (f :: * -> *) a. Applicative f => a -> f a pure ResolverValue m forall (m :: * -> *). ResolverValue m mkNull findType :: (Monad m, WithSchema m) => TypeName -> Schema VALID -> m (ResolverValue m) findType :: TypeName -> Schema VALID -> m (ResolverValue m) findType = m (ResolverValue m) -> (TypeDefinition ANY VALID -> m (ResolverValue m)) -> TypeName -> Schema VALID -> m (ResolverValue m) forall k a c d. Selectable k a c => d -> (a -> d) -> k -> c -> d selectOr (ResolverValue m -> m (ResolverValue m) forall (f :: * -> *) a. Applicative f => a -> f a pure ResolverValue m forall (m :: * -> *). ResolverValue m mkNull) TypeDefinition ANY VALID -> m (ResolverValue m) forall a (m :: * -> *). (RenderIntrospection a, Monad m, WithSchema m) => a -> m (ResolverValue m) render schemaResolver :: (Monad m, WithSchema m) => Schema VALID -> m (ResolverValue m) schemaResolver :: Schema VALID -> m (ResolverValue m) schemaResolver schema :: Schema VALID schema@Schema {TypeDefinition OBJECT VALID query :: forall (s :: Stage). Schema s -> TypeDefinition OBJECT s query :: TypeDefinition OBJECT VALID query, Maybe (TypeDefinition OBJECT VALID) mutation :: forall (s :: Stage). Schema s -> Maybe (TypeDefinition OBJECT s) mutation :: Maybe (TypeDefinition OBJECT VALID) mutation, Maybe (TypeDefinition OBJECT VALID) subscription :: forall (s :: Stage). Schema s -> Maybe (TypeDefinition OBJECT s) subscription :: Maybe (TypeDefinition OBJECT VALID) subscription, [DirectiveDefinition VALID] directiveDefinitions :: forall (s :: Stage). Schema s -> [DirectiveDefinition s] directiveDefinitions :: [DirectiveDefinition VALID] directiveDefinitions} = ResolverValue m -> m (ResolverValue m) forall (f :: * -> *) a. Applicative f => a -> f a pure (ResolverValue m -> m (ResolverValue m)) -> ResolverValue m -> m (ResolverValue m) forall a b. (a -> b) -> a -> b $ TypeName -> [ResolverEntry m] -> ResolverValue m forall (m :: * -> *). TypeName -> [ResolverEntry m] -> ResolverValue m mkObject TypeName "__Schema" [ (FieldName "types", Schema VALID -> m (ResolverValue m) forall (m :: * -> *). (Monad m, WithSchema m) => Schema VALID -> m (ResolverValue m) resolveTypes Schema VALID schema), (FieldName "queryType", Maybe (TypeDefinition OBJECT VALID) -> m (ResolverValue m) forall (m :: * -> *). (Monad m, WithSchema m) => Maybe (TypeDefinition OBJECT VALID) -> m (ResolverValue m) renderOperation (TypeDefinition OBJECT VALID -> Maybe (TypeDefinition OBJECT VALID) forall a. a -> Maybe a Just TypeDefinition OBJECT VALID query)), (FieldName "mutationType", Maybe (TypeDefinition OBJECT VALID) -> m (ResolverValue m) forall (m :: * -> *). (Monad m, WithSchema m) => Maybe (TypeDefinition OBJECT VALID) -> m (ResolverValue m) renderOperation Maybe (TypeDefinition OBJECT VALID) mutation), (FieldName "subscriptionType", Maybe (TypeDefinition OBJECT VALID) -> m (ResolverValue m) forall (m :: * -> *). (Monad m, WithSchema m) => Maybe (TypeDefinition OBJECT VALID) -> m (ResolverValue m) renderOperation Maybe (TypeDefinition OBJECT VALID) subscription), (FieldName "directives", [DirectiveDefinition VALID] -> m (ResolverValue m) forall a (m :: * -> *). (RenderIntrospection a, Monad m, WithSchema m) => a -> m (ResolverValue m) render [DirectiveDefinition VALID] directiveDefinitions) ] schemaAPI :: Monad m => Schema VALID -> ResolverValue (Resolver QUERY e m) schemaAPI :: Schema VALID -> ResolverValue (Resolver QUERY e m) schemaAPI Schema VALID schema = TypeName -> [ResolverEntry (Resolver QUERY e m)] -> ResolverValue (Resolver QUERY e m) forall (m :: * -> *). TypeName -> [ResolverEntry m] -> ResolverValue m mkObject TypeName "Root" [ (FieldName "__type", (Arguments VALID -> Resolver QUERY e m (ResolverValue (Resolver QUERY e m))) -> Resolver QUERY e m (ResolverValue (Resolver QUERY e m)) forall (o :: OperationType) (m :: * -> *) e a. (LiftOperation o, Monad m) => (Arguments VALID -> Resolver o e m a) -> Resolver o e m a withArguments Arguments VALID -> Resolver QUERY e m (ResolverValue (Resolver QUERY e m)) typeResolver), (FieldName "__schema", Schema VALID -> Resolver QUERY e m (ResolverValue (Resolver QUERY e m)) forall (m :: * -> *). (Monad m, WithSchema m) => Schema VALID -> m (ResolverValue m) schemaResolver Schema VALID schema) ] where typeResolver :: Arguments VALID -> Resolver QUERY e m (ResolverValue (Resolver QUERY e m)) typeResolver = Resolver QUERY e m (ResolverValue (Resolver QUERY e m)) -> (Argument VALID -> Resolver QUERY e m (ResolverValue (Resolver QUERY e m))) -> FieldName -> Arguments VALID -> Resolver QUERY e m (ResolverValue (Resolver QUERY e m)) forall k a c d. Selectable k a c => d -> (a -> d) -> k -> c -> d selectOr (ResolverValue (Resolver QUERY e m) -> Resolver QUERY e m (ResolverValue (Resolver QUERY e m)) forall (f :: * -> *) a. Applicative f => a -> f a pure ResolverValue (Resolver QUERY e m) forall (m :: * -> *). ResolverValue m mkNull) Argument VALID -> Resolver QUERY e m (ResolverValue (Resolver QUERY e m)) forall (m :: * -> *) (valid :: Stage). WithSchema m => Argument valid -> m (ResolverValue m) handleArg (FieldName "name" :: FieldName) where handleArg :: Argument valid -> m (ResolverValue m) handleArg Argument { argumentValue :: forall (valid :: Stage). Argument valid -> Value valid argumentValue = (Scalar (String Description typename)) } = TypeName -> Schema VALID -> m (ResolverValue m) forall (m :: * -> *). (Monad m, WithSchema m) => TypeName -> Schema VALID -> m (ResolverValue m) findType (Description -> TypeName TypeName Description typename) Schema VALID schema handleArg Argument valid _ = ResolverValue m -> m (ResolverValue m) forall (f :: * -> *) a. Applicative f => a -> f a pure ResolverValue m forall (m :: * -> *). ResolverValue m mkNull withSystemFields :: Monad m => Schema VALID -> RootResolverValue e m -> ResultT e' m (RootResolverValue e m) withSystemFields :: Schema VALID -> RootResolverValue e m -> ResultT e' m (RootResolverValue e m) withSystemFields Schema VALID schema RootResolverValue {ResolverState (ResolverValue (Resolver QUERY e m)) query :: forall e (m :: * -> *). RootResolverValue e m -> ResolverState (ResolverValue (Resolver QUERY e m)) query :: ResolverState (ResolverValue (Resolver QUERY e m)) query, Maybe (Selection VALID -> ResolverState (Channel e)) ResolverState (ResolverValue (Resolver MUTATION e m)) ResolverState (ResolverValue (Resolver SUBSCRIPTION e m)) channelMap :: forall e (m :: * -> *). RootResolverValue e m -> Maybe (Selection VALID -> ResolverState (Channel e)) subscription :: forall e (m :: * -> *). RootResolverValue e m -> ResolverState (ResolverValue (Resolver SUBSCRIPTION e m)) mutation :: forall e (m :: * -> *). RootResolverValue e m -> ResolverState (ResolverValue (Resolver MUTATION e m)) channelMap :: Maybe (Selection VALID -> ResolverState (Channel e)) subscription :: ResolverState (ResolverValue (Resolver SUBSCRIPTION e m)) mutation :: ResolverState (ResolverValue (Resolver MUTATION e m)) ..} = RootResolverValue e m -> ResultT e' m (RootResolverValue e m) forall (f :: * -> *) a. Applicative f => a -> f a pure (RootResolverValue e m -> ResultT e' m (RootResolverValue e m)) -> RootResolverValue e m -> ResultT e' m (RootResolverValue e m) forall a b. (a -> b) -> a -> b $ RootResolverValue :: forall e (m :: * -> *). ResolverState (ResolverValue (Resolver QUERY e m)) -> ResolverState (ResolverValue (Resolver MUTATION e m)) -> ResolverState (ResolverValue (Resolver SUBSCRIPTION e m)) -> Maybe (Selection VALID -> ResolverState (Channel e)) -> RootResolverValue e m RootResolverValue { query :: ResolverState (ResolverValue (Resolver QUERY e m)) query = ResolverState (ResolverValue (Resolver QUERY e m)) query ResolverState (ResolverValue (Resolver QUERY e m)) -> (ResolverValue (Resolver QUERY e m) -> ResolverState (ResolverValue (Resolver QUERY e m))) -> ResolverState (ResolverValue (Resolver QUERY e m)) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= (ResolverValue (Resolver QUERY e m) -> ResolverValue (Resolver QUERY e m) -> ResolverState (ResolverValue (Resolver QUERY e m)) forall (m :: * -> *) a. SemigroupM m a => a -> a -> m a <:> Schema VALID -> ResolverValue (Resolver QUERY e m) forall (m :: * -> *) e. Monad m => Schema VALID -> ResolverValue (Resolver QUERY e m) schemaAPI Schema VALID schema), Maybe (Selection VALID -> ResolverState (Channel e)) ResolverState (ResolverValue (Resolver MUTATION e m)) ResolverState (ResolverValue (Resolver SUBSCRIPTION e m)) channelMap :: Maybe (Selection VALID -> ResolverState (Channel e)) subscription :: ResolverState (ResolverValue (Resolver SUBSCRIPTION e m)) mutation :: ResolverState (ResolverValue (Resolver MUTATION e m)) channelMap :: Maybe (Selection VALID -> ResolverState (Channel e)) subscription :: ResolverState (ResolverValue (Resolver SUBSCRIPTION e m)) mutation :: ResolverState (ResolverValue (Resolver MUTATION e m)) .. }