morpheus-graphql-server-0.27.1: src/Data/Morpheus/Server/Deriving/Kinded/Arguments.hs
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Data.Morpheus.Server.Deriving.Kinded.Arguments
( DeriveFieldArguments (..),
HasArguments,
)
where
import Data.Morpheus.Internal.Ext ((<:>))
import Data.Morpheus.Server.Deriving.Internal.Schema.Internal
( CatType,
deriveTypeAsArguments,
)
import Data.Morpheus.Server.Deriving.Utils.Kinded
( CatType (..),
)
import Data.Morpheus.Server.Deriving.Utils.Use
( UseDeriving (..),
UseGQLType (..),
)
import Data.Morpheus.Server.Types.SchemaT
( SchemaT,
withInput,
)
import Data.Morpheus.Types.Internal.AST
( ArgumentsDefinition,
CONST,
OUT,
)
import Relude
type family HasArguments a where
HasArguments (a -> b) = (a -> b)
HasArguments a = ()
class DeriveFieldArguments gql a where
deriveFieldArguments :: UseDeriving gql val -> f a -> SchemaT OUT (Maybe (ArgumentsDefinition CONST))
instance DeriveFieldArguments gql () where
deriveFieldArguments _ _ = pure Nothing
instance (gql b, gql a) => DeriveFieldArguments gql (a -> b) where
deriveFieldArguments UseDeriving {..} _ = do
a <- withInput $ deriveTypeAsArguments dirGQL (Proxy @a)
b <- useDeriveFieldArguments dirGQL (OutputType :: CatType OUT b)
case b of
Just x -> Just <$> (a <:> x)
Nothing -> pure $ Just a