summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2023-04-20 12:51:18 +0200
committerEugen Wissner <belka@caraus.de>2023-04-20 12:51:18 +0200
commit4bd243b7ec9e564e82d53d1b5ab4076f33888d20 (patch)
tree0668ede1e5f1f3045b9914e5b9c11d0e2928a3a8
parent1b9d8af93210a4d1a49a03b660670ec35fbe052f (diff)
downloadgraphql-spice-4bd243b7ec9e564e82d53d1b5ab4076f33888d20.tar.gz
Export resolver exceptions
-rw-r--r--CHANGELOG.md3
-rw-r--r--cabal.project4
-rw-r--r--graphql-spice.cabal2
-rw-r--r--src/Language/GraphQL/Resolver.hs8
4 files changed, 9 insertions, 8 deletions
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