diff --git a/CHANGELOG.md b/CHANGELOG.md index 254797c..80a6bc3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ and this project adheres to ## [Unreleased] ### Added - `ToGraphQL` and `FromGraphQL` instances for `Word`. +- `Resolver`: Export `ServerException`. +- `Resolver.defaultResolver`: Throw `FieldNotResolvedException` if the requested + field is not in the parent object. ## [1.0.1.0] - 2023-02-17 ### Added diff --git a/cabal.project b/cabal.project deleted file mode 100644 index 6d2c14d..0000000 --- a/cabal.project +++ /dev/null @@ -1,4 +0,0 @@ -packages: - . - -constraints: graphql -json diff --git a/graphql-spice.cabal b/graphql-spice.cabal index ea09761..eb8a16e 100644 --- a/graphql-spice.cabal +++ b/graphql-spice.cabal @@ -38,7 +38,7 @@ library containers ^>= 0.6.2, exceptions ^>= 0.10.4, hspec-expectations >= 0.8.2 && < 0.9, - graphql >= 1.0, + graphql >= 1.2, megaparsec >= 9.0 && < 10, scientific ^>= 0.3.7, text >= 1.2 && < 3, diff --git a/src/Language/GraphQL/Resolver.hs b/src/Language/GraphQL/Resolver.hs index dbf9a6a..c3d6660 100644 --- a/src/Language/GraphQL/Resolver.hs +++ b/src/Language/GraphQL/Resolver.hs @@ -6,13 +6,14 @@ -- | Helper functions and exceptions to write resolvers. module Language.GraphQL.Resolver - ( argument + ( ServerException(..) + , argument , defaultResolver ) where import Control.Monad.Catch (Exception(..), MonadCatch(..), MonadThrow(..)) import Control.Monad.Trans.Reader (ReaderT, asks) -import Data.HashMap.Strict ((!)) +import qualified Data.HashMap.Strict as HashMap import Data.Text (Text) import qualified Data.Text as Text import Data.Typeable (cast) @@ -49,7 +50,8 @@ defaultResolver :: MonadCatch m => Name -> Type.Resolve m defaultResolver fieldName = do values' <- asks Type.values case values' of - Type.Object objectValue -> pure $ objectValue ! fieldName + Type.Object objectValue + | Just result <- HashMap.lookup fieldName objectValue -> pure result _nonObject -> throwM $ FieldNotResolvedException fieldName -- | Takes an argument name, validates that the argument exists, and optionally