{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
module Data.Morpheus.Error.Document.Interface
( unknownInterface,
PartialImplements (..),
ImplementsError (..),
Place (..),
)
where
import Data.Morpheus.Error.Utils (globalErrorMessage)
import Data.Morpheus.Types.Internal.AST.Base
( FieldName (..),
GQLError (..),
GQLErrors,
TypeName (..),
TypeRef,
msg,
)
import Data.Morpheus.Types.Internal.Validation.SchemaValidator
( Field (..),
Interface (..),
renderField,
)
import Data.Semigroup ((<>))
unknownInterface :: TypeName -> GQLErrors
unknownInterface name = globalErrorMessage message
where
message = "Unknown Interface " <> msg name <> "."
data ImplementsError
= UnexpectedType
{ expectedType :: TypeRef,
foundType :: TypeRef
}
| Missing
data Place = Place
{ fieldname :: TypeName,
typename :: FieldName,
fieldArg :: Maybe (FieldName, TypeName)
}
class PartialImplements ctx where
partialImplements :: ctx -> ImplementsError -> GQLErrors
instance PartialImplements (Interface, FieldName) where
partialImplements (Interface interfaceName typename, fieldname) errorType =
[ GQLError
{ message = message,
locations = []
}
]
where
message =
"Interface field "
<> renderField interfaceName fieldname Nothing
<> detailedMessage errorType
detailedMessage UnexpectedType {expectedType, foundType} =
" expects type "
<> msg expectedType
<> " but "
<> renderField typename fieldname Nothing
<> " is type "
<> msg foundType
<> "."
detailedMessage Missing =
" expected but "
<> msg typename
<> " does not provide it."
instance PartialImplements (Interface, Field) where
partialImplements (Interface interfaceName typename, Field fieldname argName) errorType =
[ GQLError
{ message = message,
locations = []
}
]
where
message =
"Interface field argument "
<> renderField interfaceName fieldname (Just argName)
<> detailedMessage errorType
detailedMessage UnexpectedType {expectedType, foundType} =
" expects type"
<> msg expectedType
<> " but "
<> renderField typename fieldname (Just argName)
<> " is type "
<> msg foundType
<> "."
detailedMessage Missing =
" expected but "
<> renderField typename fieldname Nothing
<> " does not provide it."