packages feed

morpheus-graphql-client-0.20.0: src/Data/Morpheus/Client/Declare/Client.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Data.Morpheus.Client.Declare.Client
  ( declareTypes,
  )
where

import Data.Morpheus.Client.Declare.Aeson
  ( aesonDeclarations,
  )
import Data.Morpheus.Client.Declare.Type
  ( typeDeclarations,
  )
import Data.Morpheus.Client.Internal.Types
  ( ClientTypeDefinition (..),
  )
import Language.Haskell.TH
import Relude hiding (Type)

declareTypes :: [ClientTypeDefinition] -> Q [Dec]
declareTypes subTypes = concat <$> traverse declareType subTypes

declareType :: ClientTypeDefinition -> Q [Dec]
declareType clientType@ClientTypeDefinition {clientKind} = do
  types <- typeDeclarations clientKind clientType
  instances <- aesonDeclarations clientKind clientType
  pure (types <> instances)