morpheus-graphql-0.0.1: src/Data/Morpheus/PreProcess/Resolve/ResolveRawQuery.hs
module Data.Morpheus.PreProcess.Resolve.ResolveRawQuery
( resolveRawQuery
) where
import Data.Morpheus.PreProcess.Resolve.Arguments (resolveArguments)
import Data.Morpheus.PreProcess.Resolve.Spread (resolveSpread)
import Data.Morpheus.PreProcess.Selection (lookupSelectionObjectFieldType)
import Data.Morpheus.Schema.Internal.Types (GObject (..), ObjectField (..), OutputObject, TypeLib (..))
import Data.Morpheus.Types.Error (Validation)
import Data.Morpheus.Types.Query.Fragment (FragmentLib)
import Data.Morpheus.Types.Query.RawSelection (RawSelection (..), RawSelectionSet)
import Data.Morpheus.Types.Query.Selection (Selection (..), SelectionSet)
import Data.Morpheus.Types.Types (Variables)
import Data.Text (Text)
resolveVariableAndSpread ::
TypeLib -> FragmentLib -> Variables -> GObject ObjectField -> (Text, RawSelection) -> Validation SelectionSet
resolveVariableAndSpread lib' fragments' variables' parent' (key', RawSelectionSet rawArgs rawSelectors position') = do
fieldType' <- lookupSelectionObjectFieldType position' key' lib' parent'
args' <- resolveArguments variables' rawArgs
sel <- concat <$> mapM (resolveVariableAndSpread lib' fragments' variables' fieldType') rawSelectors
pure [(key', SelectionSet args' sel position')]
resolveVariableAndSpread _ _ variables' _ (sKey, RawField rawArgs field sPos) = do
args' <- resolveArguments variables' rawArgs
pure [(sKey, Field args' field sPos)]
resolveVariableAndSpread lib' fragments' variables' parent' (spreadID, Spread _ sPos) =
concat <$> (resolveSpread fragments' parent' sPos spreadID >>= recursiveResolve)
where
recursiveResolve = mapM (resolveVariableAndSpread lib' fragments' variables' parent')
resolveRawQuery :: TypeLib -> FragmentLib -> Variables -> RawSelectionSet -> OutputObject -> Validation SelectionSet
resolveRawQuery lib' fragments' variables' sel query' =
concat <$> mapM (resolveVariableAndSpread lib' fragments' variables' query') sel