packages feed

morpheus-graphql-server-0.27.0: src/Data/Morpheus/Server/Deriving/Utils/Use.hs

{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE RankNTypes #-}

module Data.Morpheus.Server.Deriving.Utils.Use
  ( UseDirective (..),
    UseDeriveType (..),
    UseArguments (..),
    UseGQLType (..),
    useTypename,
  )
where

import Data.Morpheus.Server.Deriving.Schema.Internal
import Data.Morpheus.Server.Types.Directives
  ( GDirectiveUsages (..),
  )
import Data.Morpheus.Server.Types.Internal
import Data.Morpheus.Server.Types.SchemaT
  ( SchemaT,
  )
import Data.Morpheus.Server.Types.TypeName
  ( TypeFingerprint,
  )
import Data.Morpheus.Types.Internal.AST
  ( Arguments,
    ArgumentsDefinition,
    CONST,
    OUT,
    TypeCategory (..),
    TypeName,
  )

useTypename :: (gqlType a) => UseGQLType gqlType -> CatType c a -> TypeName
useTypename gql proxy@InputType = __useTypename gql IN proxy
useTypename gql proxy@OutputType = __useTypename gql OUT proxy

data UseGQLType gql = UseGQLType
  { __useFingerprint :: forall f a. gql a => TypeCategory -> f a -> TypeFingerprint,
    __useTypename :: forall f a. gql a => TypeCategory -> f a -> TypeName,
    __useTypeData :: forall f a. gql a => f a -> TypeCategory -> TypeData
  }

data UseArguments args = UseArguments
  { useDeriveArguments :: forall f a. args a => f a -> SchemaT OUT (ArgumentsDefinition CONST),
    useEncodeArguments :: forall k a. args a => a -> SchemaT k (Arguments CONST)
  }

data UseDirective gql args = UseDirective
  { __directives :: forall f a. gql a => f a -> GDirectiveUsages gql args,
    dirArgs :: UseArguments args,
    dirGQL :: UseGQLType gql
  }

data UseDeriveType derive = UseDeriveType
  { useDeriveType :: forall c a. derive c a => CatType c a -> SchemaT c (),
    useDeriveContent :: forall c a. derive c a => CatType c a -> TyContentM c
  }