morpheus-graphql-client-0.25.0: src/Data/Morpheus/Client/CodeGen/Interpreting/Arguments.hs
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Data.Morpheus.Client.CodeGen.Interpreting.Arguments
( genArguments,
)
where
import Data.Morpheus.Client.CodeGen.AST
( ClientPreDeclaration (..),
DERIVING_MODE (..),
)
import Data.Morpheus.Client.CodeGen.Interpreting.Core
( defaultDerivations,
)
import Data.Morpheus.CodeGen.Internal.AST
( CodeGenConstructor (..),
CodeGenField (..),
CodeGenType (..),
FIELD_TYPE_WRAPPER (..),
fromTypeName,
getFullName,
)
import Data.Morpheus.Types.Internal.AST
( RAW,
TypeName,
TypeRef (..),
Variable (..),
VariableDefinitions,
isNullable,
)
import Relude hiding (empty, show)
genArguments :: TypeName -> VariableDefinitions RAW -> (TypeName, [ClientPreDeclaration])
genArguments operationTypeName variables
| null variables = ("()", [])
| otherwise = (getFullName cgTypeName, [ClientType def, ToJSONClass TYPE_MODE def])
where
def =
CodeGenType
{ cgTypeName,
cgConstructors =
[ CodeGenConstructor
{ constructorName = cgTypeName,
constructorFields = packAsCodeGenField <$> toList variables
}
],
cgDerivations = defaultDerivations
}
cgTypeName = fromTypeName $ operationTypeName <> "Args"
packAsCodeGenField :: Variable RAW -> CodeGenField
packAsCodeGenField Variable {variableName, variableType = ref@TypeRef {..}} =
CodeGenField
{ fieldName = variableName,
fieldType = typeConName,
wrappers = [GQL_WRAPPER typeWrappers],
fieldIsNullable = isNullable ref
}