packages feed

morpheus-graphql-0.11.0: test/Feature/TypeInference/API.hs

{-# LANGUAGE DeriveAnyClass         #-}
{-# LANGUAGE DeriveGeneric          #-}
{-# LANGUAGE OverloadedStrings      #-}
{-# LANGUAGE TypeFamilies           #-}
{-# LANGUAGE TypeOperators          #-}
{-# LANGUAGE NamedFieldPuns         #-}
{-# LANGUAGE DuplicateRecordFields  #-}

module Feature.TypeInference.API
  ( api
  )
where

import           Data.Morpheus                  ( interpreter )
import           Data.Morpheus.Kind             ( INPUT )
import           Data.Morpheus.Types            ( GQLRequest
                                                , GQLResponse
                                                , GQLRootResolver(..)
                                                , GQLType(..)
                                                , Undefined(..)
                                                )
import           Data.Text                      ( Text
                                                , pack
                                                )
import           GHC.Generics                   ( Generic )

data Power = Thunderbolts | Shapeshift | Hurricanes
  deriving (Generic,GQLType)

data Deity (m :: * -> *) = Deity {
  name :: Text ,
  power :: Power
} deriving(Generic,GQLType)

deityRes :: Deity m
deityRes = Deity { name = "Morpheus", power = Shapeshift }

data Hydra = Hydra {
  name :: Text,
  age :: Int
} deriving (Show,Generic)

instance GQLType Hydra where
  type KIND Hydra = INPUT

data Monster =
    MonsterHydra Hydra
  | Cerberus { name :: Text }
  | UnidentifiedMonster
  deriving (Show, Generic)

instance GQLType Monster where
  type KIND Monster = INPUT

data Character (m :: * -> *) =
  CharacterDeity (Deity m) -- Only <tycon name><type ref name> should generate direct link
  -- RECORDS
  | Creature { creatureName :: Text, creatureAge :: Int }
  | BoxedDeity { boxedDeity :: Deity m}
  | ScalarRecord { scalarText :: Text }
  --- Types 
  | CharacterInt Int -- all scalars mus be boxed
  -- Types
  | SomeDeity (Deity m)
  | SomeMutli Int Text
  --- ENUMS
  | Zeus
  | Cronus deriving (Generic, GQLType)


newtype MonsterArgs = MonsterArgs {
  monster :: Monster
} deriving (Generic)

data Query (m :: * -> *) = Query
  { deity :: Deity m,
    character :: [Character m],
    showMonster :: MonsterArgs -> m Text
  } deriving (Generic, GQLType)

rootResolver :: GQLRootResolver IO () Query Undefined Undefined
rootResolver = GQLRootResolver
  { queryResolver        = Query { deity = deityRes, character, showMonster }
  , mutationResolver     = Undefined
  , subscriptionResolver = Undefined
  }
 where
  showMonster MonsterArgs { monster } = pure (pack $ show monster)
  character :: [Character m]
  character =
    [ CharacterDeity deityRes
    , Creature { creatureName = "Lamia", creatureAge = 205 }
    , BoxedDeity { boxedDeity = deityRes }
    , ScalarRecord { scalarText = "Some Text" }
      ---
    , SomeDeity deityRes
    , CharacterInt 12
    , SomeMutli 21 "some text"
    , Zeus
    , Cronus
    ]


api :: GQLRequest -> IO GQLResponse
api = interpreter rootResolver