forked from OSS/graphql-spice
Convert the response to JSON
This commit is contained in:
parent
90abeb6425
commit
0cf459b8eb
@ -1,4 +1,3 @@
|
|||||||
packages: .
|
packages: . ../graphql
|
||||||
|
|
||||||
constraints: graphql -json
|
constraints: graphql -json
|
||||||
tests: False
|
|
||||||
|
@ -32,9 +32,13 @@ library
|
|||||||
build-depends:
|
build-depends:
|
||||||
aeson ^>= 2.0.3,
|
aeson ^>= 2.0.3,
|
||||||
base ^>=4.14.3.0,
|
base ^>=4.14.3.0,
|
||||||
|
containers ^>= 0.6.2,
|
||||||
|
exceptions ^>= 0.10.4,
|
||||||
graphql ^>= 1.0.2,
|
graphql ^>= 1.0.2,
|
||||||
|
megaparsec >= 9.0 && < 10,
|
||||||
scientific ^>= 0.3.7,
|
scientific ^>= 0.3.7,
|
||||||
text ^>= 1.2.5,
|
text ^>= 1.2.5,
|
||||||
|
vector ^>= 0.12.3,
|
||||||
unordered-containers ^>= 0.2.16
|
unordered-containers ^>= 0.2.16
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
|
|
||||||
|
@ -1,5 +1,58 @@
|
|||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
{-# LANGUAGE NamedFieldPuns #-}
|
||||||
|
{-# LANGUAGE RecordWildCards #-}
|
||||||
|
|
||||||
module Language.GraphQL.Foundation
|
module Language.GraphQL.Foundation
|
||||||
( module Language.GraphQL.Serialize
|
( module Language.GraphQL.Serialize
|
||||||
|
, graphql
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Language.GraphQL.Serialize
|
import Language.GraphQL.Serialize
|
||||||
|
import Control.Monad.Catch (MonadCatch)
|
||||||
|
import qualified Data.Aeson as Aeson
|
||||||
|
import qualified Data.Aeson.Types as Aeson
|
||||||
|
import Data.HashMap.Strict (HashMap)
|
||||||
|
import qualified Data.Aeson.KeyMap as KeyMap
|
||||||
|
import Data.Maybe (catMaybes)
|
||||||
|
import qualified Data.Sequence as Seq
|
||||||
|
import Data.Text (Text)
|
||||||
|
import Data.Vector (Vector)
|
||||||
|
import qualified Data.Vector as Vector
|
||||||
|
import qualified Language.GraphQL as GraphQL
|
||||||
|
import Language.GraphQL.AST
|
||||||
|
import Language.GraphQL.Error
|
||||||
|
import Language.GraphQL.Type.Schema (Schema)
|
||||||
|
import Data.Bifunctor (Bifunctor(..))
|
||||||
|
|
||||||
|
-- | If the text parses correctly as a @GraphQL@ query the query is
|
||||||
|
-- executed using the given 'Schema'.
|
||||||
|
graphql :: MonadCatch m
|
||||||
|
=> Schema m -- ^ Resolvers.
|
||||||
|
-> Text -- ^ Text representing a @GraphQL@ request document.
|
||||||
|
-> m (Either (ResponseEventStream m Aeson.Value) Aeson.Object) -- ^ Response.
|
||||||
|
graphql schema = fmap (bimap stream formatResponse)
|
||||||
|
. GraphQL.graphql schema mempty (mempty :: HashMap Name JSON)
|
||||||
|
where
|
||||||
|
stream :: ResponseEventStream m JSON -> ResponseEventStream m Aeson.Value
|
||||||
|
stream = undefined
|
||||||
|
formatResponse :: Response JSON -> Aeson.Object
|
||||||
|
formatResponse Response{ errors, data' = JSON json } =
|
||||||
|
let dataResponse = KeyMap.singleton "data" json
|
||||||
|
in case errors of
|
||||||
|
Seq.Empty -> dataResponse
|
||||||
|
_ -> flip (KeyMap.insert "errors") dataResponse
|
||||||
|
$ Aeson.Array $ foldr fromError mempty errors
|
||||||
|
fromError :: Error -> Vector Aeson.Value -> Vector Aeson.Value
|
||||||
|
fromError Error{..} = Vector.cons $ Aeson.object $ catMaybes
|
||||||
|
[ Just ("message", Aeson.String message)
|
||||||
|
, toMaybe fromLocation "locations" locations
|
||||||
|
, toMaybe fromPath "path" path
|
||||||
|
]
|
||||||
|
fromPath (Segment segment) = Aeson.String segment
|
||||||
|
fromPath (Index index) = Aeson.toJSON index
|
||||||
|
fromLocation Location{..} = Aeson.object
|
||||||
|
[ ("line", Aeson.toJSON line)
|
||||||
|
, ("column", Aeson.toJSON column)
|
||||||
|
]
|
||||||
|
toMaybe _ _ [] = Nothing
|
||||||
|
toMaybe f key xs = Just (key, Aeson.listValue f xs)
|
||||||
|
Loading…
Reference in New Issue
Block a user