morpheus-graphql-0.0.1: src/Data/Morpheus/Kind/GQLArgs.hs
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Data.Morpheus.Kind.GQLArgs
( GQLArgs(..)
) where
import Data.Morpheus.Error.Internal (internalArgumentError)
import Data.Morpheus.Generics.GDecode (GDecode (..))
import Data.Morpheus.Generics.TypeRep (Selectors (..))
import Data.Morpheus.Generics.Utils (RecSel, SelOf)
import qualified Data.Morpheus.Kind.GQLInput as I (GQLInput (..))
import Data.Morpheus.Schema.Internal.Types (InputField, TypeLib)
import Data.Morpheus.Schema.Type (DeprecationArgs)
import Data.Morpheus.Types.Error (Validation)
import Data.Morpheus.Types.MetaInfo (MetaInfo (..), initialMeta)
import Data.Morpheus.Types.Query.Selection (Argument (..), Arguments)
import Data.Proxy (Proxy (..))
import Data.Text (Text, pack)
import GHC.Generics
instance (Selector s, I.GQLInput a) => Selectors (RecSel s a) (Text, InputField) where
getFields _ = [((name, I.asArgument (Proxy @a) name), I.introInput (Proxy @a))]
where
name = pack $ selName (undefined :: SelOf s)
instance I.GQLInput a => GDecode Arguments (K1 i a) where
gDecode meta args =
case lookup (key meta) args of
Nothing -> internalArgumentError "Required Argument Not Found"
Just (Argument x _pos) -> K1 <$> I.decode x
class GQLArgs p where
decode :: Arguments -> Validation p
default decode :: (Generic p, GDecode Arguments (Rep p)) =>
Arguments -> Validation p
decode args = to <$> gDecode initialMeta args
introspect :: Proxy p -> [((Text, InputField), TypeLib -> TypeLib)]
default introspect :: Selectors (Rep p) (Text, InputField) =>
Proxy p -> [((Text, InputField), TypeLib -> TypeLib)]
introspect _ = getFields (Proxy @(Rep p))
instance GQLArgs () where
decode _ = pure ()
introspect _ = []
instance GQLArgs DeprecationArgs