diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f7f370..ae76a2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ and this project adheres to and event stream) resolvers to signalize an error. Other exceptions will escape. - `Test.Hspec.GraphQL` contains some test helpers. +- `Validate` contains the validator and standard rules. ## Changed - `Type.Out.Resolver`: Interface fields don't have resolvers, object fields diff --git a/graphql.cabal b/graphql.cabal index eb514e0..6ac951a 100644 --- a/graphql.cabal +++ b/graphql.cabal @@ -4,10 +4,10 @@ cabal-version: 1.12 -- -- see: https://github.com/sol/hpack -- --- hash: ba234bcfff46df053a3466359e32682c4592b88894911ecbe78bd00fa00929b5 +-- hash: 5fa34f11ab1242b72c75c3c19b31ba310c24716a0eb2d134d2b17dd558280732 name: graphql -version: 0.8.0.0 +version: 0.9.0.0 synopsis: Haskell GraphQL implementation description: This package provides a rudimentary parser for the language. category: Language diff --git a/package.yaml b/package.yaml index d24e4ba..dcdc6c8 100644 --- a/package.yaml +++ b/package.yaml @@ -1,5 +1,5 @@ name: graphql -version: 0.8.0.0 +version: 0.9.0.0 synopsis: Haskell GraphQL implementation description: This package provides a rudimentary parser for the diff --git a/src/Language/GraphQL/Validate.hs b/src/Language/GraphQL/Validate.hs index 6df97a1..5768615 100644 --- a/src/Language/GraphQL/Validate.hs +++ b/src/Language/GraphQL/Validate.hs @@ -5,6 +5,7 @@ {-# LANGUAGE ExplicitForAll #-} {-# LANGUAGE LambdaCase #-} +-- | GraphQL validator. module Language.GraphQL.Validate ( Error(..) , Path(..) @@ -29,17 +30,24 @@ data Context m = Context type ValidateT m = Reader (Context m) (Seq Error) +-- | If an error can be associated to a particular field in the GraphQL result, +-- it must contain an entry with the key path that details the path of the +-- response field which experienced the error. This allows clients to identify +-- whether a null result is intentional or caused by a runtime error. data Path - = Segment Text - | Index Int + = Segment Text -- ^ Field name. + | Index Int -- ^ List index if a field returned a list. deriving (Eq, Show) +-- | Validation error. data Error = Error { message :: String , locations :: [Location] , path :: [Path] } deriving (Eq, Show) +-- | Validates a document and returns a list of found errors. If the returned +-- list is empty, the document is valid. document :: forall m. Schema m -> [Rule] -> Document -> Seq Error document schema' rules' document' = runReader (foldrM go Seq.empty document') context diff --git a/src/Language/GraphQL/Validate/Rules.hs b/src/Language/GraphQL/Validate/Rules.hs index bc754c2..a3314e7 100644 --- a/src/Language/GraphQL/Validate/Rules.hs +++ b/src/Language/GraphQL/Validate/Rules.hs @@ -2,6 +2,7 @@ v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. -} +-- | This module contains default rules defined in the GraphQL specification. module Language.GraphQL.Validate.Rules ( Rule(..) , executableDefinitionsRule @@ -10,14 +11,19 @@ module Language.GraphQL.Validate.Rules import Language.GraphQL.AST.Document +-- | 'Rule' assigns a function to each AST node that can be validated. If the +-- validation fails, the function should return an error message, or 'Nothing' +-- otherwise. newtype Rule = DefinitionRule (Definition -> Maybe String) +-- | Default reules given in the specification. specifiedRules :: [Rule] specifiedRules = [ executableDefinitionsRule ] +-- | Definition must be OperationDefinition or FragmentDefinition. executableDefinitionsRule :: Rule executableDefinitionsRule = DefinitionRule go where diff --git a/stack.yaml b/stack.yaml index 513705a..a494b98 100644 --- a/stack.yaml +++ b/stack.yaml @@ -1,4 +1,4 @@ -resolver: lts-16.5 +resolver: lts-16.6 packages: - .