morpheus-graphql-0.0.1: src/Data/Morpheus/Error/Variable.hs
{-# LANGUAGE OverloadedStrings #-}
module Data.Morpheus.Error.Variable
( undefinedVariable
, unknownType
, variableGotInvalidValue
, uninitializedVariable
, unusedVariables
) where
import Data.Morpheus.Error.Utils (errorMessage)
import Data.Morpheus.Types.Core (EnhancedKey (..))
import Data.Morpheus.Types.Error (GQLError (..), GQLErrors)
import Data.Morpheus.Types.MetaInfo (Position)
import Data.Text (Text)
import qualified Data.Text as T (concat)
-- query M ( $v : String ) { a } -> "Variable \"$bla\" is never used in operation \"MyMutation\".",
{-|
VARIABLES:
Variable -> Error (position Query Head)
data E = EN | DE
query M ( $v : E ){...}
query Q ($a: D) -> "Unknown type \"D\"."
case String
- { "v" : "EN" } -> no error converts as enum
case type mismatch
- { "v": { "a": "v1" ... } } -> "Variable \"$v\" got invalid value { "a": "v1" ... } ; Expected type LANGUAGE."
- { "v" : "v1" } -> "Variable \"$v\" got invalid value \"v1\"; Expected type LANGUAGE."
- { "v": 1 } "Variable \"$v\" got invalid value 1; Expected type LANGUAGE."
TODO: variable does not match to argument type
- query M ( $v : String ) { a(p:$v) } -> "Variable \"$v\" of type \"String\" used in position expecting type \"LANGUAGE\"."
|-}
unusedVariables :: [EnhancedKey] -> GQLErrors
unusedVariables = map keyToError
where
keyToError (EnhancedKey key' position') = GQLError {desc = text key', posIndex = [position']}
text key' = T.concat ["Variable \"$", key', "\" is never used in operation \"Query\"."]
variableGotInvalidValue :: Text -> Text -> Position -> GQLErrors
variableGotInvalidValue name' inputMessage' position' = errorMessage position' text
where
text = T.concat ["Variable \"$", name', "\" got invalid value; ", inputMessage']
unknownType :: Text -> Position -> GQLErrors
unknownType type' position' = errorMessage position' text
where
text = T.concat ["Unknown type \"", type', "\"."]
undefinedVariable :: Text -> Position -> Text -> GQLErrors
undefinedVariable operation' position' key' = errorMessage position' text
where
text = T.concat ["Variable \"", key', "\" is not defined by operation \"", operation', "\"."]
uninitializedVariable :: Position -> Text -> GQLErrors
uninitializedVariable position' key' = errorMessage position' text
where
text = T.concat ["Value for Variable \"$", key', "\" is not initialized in Query body."]