packages feed

morpheus-graphql-server-0.22.0: src/Data/Morpheus/Server/Deriving/Named/Encode.hs

{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Data.Morpheus.Server.Deriving.Named.Encode
  ( deriveNamedModel,
    EncodeNamedConstraints,
  )
where

import Data.Morpheus.App.Internal.Resolving
  ( NamedResolver (..),
    Resolver,
    RootResolverValue (..),
  )
import Data.Morpheus.Server.Deriving.Named.EncodeType
  ( EncodeTypeConstraint,
    deriveResolver,
  )
import Data.Morpheus.Server.Deriving.Utils.GTraversable
  ( traverseTypes,
  )
import Data.Morpheus.Server.NamedResolvers (NamedResolverT (..))
import Data.Morpheus.Server.Resolvers
  ( NamedResolvers (..),
  )
import Data.Morpheus.Types.Internal.AST
  ( QUERY,
  )
import qualified GHC.Exts as HM
import Relude

type EncodeNamedConstraints e m query mut sub =
  (EncodeTypeConstraint (Resolver QUERY e m) query)

deriveNamedModel ::
  forall e m query mut sub.
  (Monad m, EncodeNamedConstraints e m query mut sub) =>
  NamedResolvers m e query mut sub ->
  RootResolverValue e m
deriveNamedModel NamedResolvers =
  NamedResolversValue $
    HM.fromList $
      map (\x -> (resolverName x, x)) $
        join $
          toList $
            traverseTypes deriveResolver (Proxy @(query (NamedResolverT (Resolver QUERY e m))))