morpheus-graphql-0.6.0: src/Data/Morpheus/Validation/Internal/Utils.hs
module Data.Morpheus.Validation.Internal.Utils
( differKeys
, existsObjectType
, lookupType
, getInputType
, lookupField
, checkNameCollision
, checkForUnknownKeys
, VALIDATION_MODE(..)
) where
import Data.List ((\\))
import Data.Morpheus.Error.Variable (unknownType)
import Data.Morpheus.Types.Internal.Base (EnhancedKey (..), Key, Position, enhanceKeyWithNull)
import Data.Morpheus.Types.Internal.Data (DataObject, DataType (..), DataTypeLib (..))
import Data.Morpheus.Types.Internal.Validation (Validation)
import qualified Data.Set as S
import Data.Text (Text)
type GenError error a = error -> Either error a
data VALIDATION_MODE
= WITHOUT_VARIABLES
| FULL_VALIDATION
deriving (Eq, Show)
lookupType :: error -> [(Text, a)] -> Text -> Either error a
lookupType error' lib' typeName' =
case lookup typeName' lib' of
Nothing -> Left error'
Just x -> pure x
lookupField :: Text -> [(Text, fType)] -> GenError error fType
lookupField id' lib' error' =
case lookup id' lib' of
Nothing -> Left error'
Just field -> pure field
getInputType :: Text -> DataTypeLib -> GenError error DataType
getInputType name lib gqlError =
case lookup name (inputObject lib) of
Just x -> pure (DataInputObject x)
Nothing ->
case lookup name (inputUnion lib) of
Just x -> pure (DataInputUnion x)
Nothing ->
case lookup name (scalar lib) of
Just x -> pure (DataScalar x)
Nothing -> case lookup name (enum lib) of
Just x -> pure (DataEnum x)
Nothing -> Left gqlError
existsObjectType :: Position -> Text -> DataTypeLib -> Validation DataObject
existsObjectType position' typeName' lib = lookupType error' (object lib) typeName'
where
error' = unknownType typeName' position'
differKeys :: [EnhancedKey] -> [Key] -> [EnhancedKey]
differKeys enhanced keys = enhanced \\ map enhanceKeyWithNull keys
removeDuplicates :: Ord a => [a] -> [a]
removeDuplicates = S.toList . S.fromList
elementOfKeys :: [Text] -> EnhancedKey -> Bool
elementOfKeys keys' EnhancedKey {uid = id'} = id' `elem` keys'
checkNameCollision :: [EnhancedKey] -> ([EnhancedKey] -> error) -> Either error [EnhancedKey]
checkNameCollision enhancedKeys errorGenerator =
case enhancedKeys \\ removeDuplicates enhancedKeys of
[] -> pure enhancedKeys
duplicates -> Left $ errorGenerator duplicates
checkForUnknownKeys :: [EnhancedKey] -> [Text] -> ([EnhancedKey] -> error) -> Either error [EnhancedKey]
checkForUnknownKeys enhancedKeys' keys' errorGenerator' =
case filter (not . elementOfKeys keys') enhancedKeys' of
[] -> pure enhancedKeys'
unknownKeys' -> Left $ errorGenerator' unknownKeys'