From a088c819442800cf9cf4a2e95d5cb4bc16584029 Mon Sep 17 00:00:00 2001 From: Danny Navarro Date: Thu, 11 Feb 2016 14:24:31 +0100 Subject: Handle Field arguments in Schema definition The `Schema` has been overhauled to make `Output` monomorphic. Traversing the `GraphQL` document is handled implicitly while defining the `Schema`. The 4th end-to-end test from `graphql-js` has been ported. --- Data/GraphQL/Schema.hs | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) (limited to 'Data/GraphQL/Schema.hs') diff --git a/Data/GraphQL/Schema.hs b/Data/GraphQL/Schema.hs index 8a6e625..8ceb11f 100644 --- a/Data/GraphQL/Schema.hs +++ b/Data/GraphQL/Schema.hs @@ -1,35 +1,34 @@ +{-# LANGUAGE CPP #-} module Data.GraphQL.Schema where -import Data.Maybe (catMaybes) +#if !MIN_VERSION_base(4,8,0) +import Control.Applicative ((<$>)) +#endif -import Data.Text (Text) import Data.Aeson (ToJSON(toJSON)) +import Data.HashMap.Strict (HashMap) +import Data.Text (Text) data Schema f = Schema (QueryRoot f) -- (Maybe MutationRoot) type QueryRoot f = Resolver f -type Resolver f = Input -> f (Output f) +type Resolver f = Input -> f Output -data Output f = OutputResolver (Resolver f) - | OutputList (f [Output f]) - | OutputScalar (f Scalar) - | OutputEnum (f Text) +data Output = OutputObject (HashMap Text Output) + | OutputList [Output] + | OutputScalar Scalar + | OutputEnum Text + deriving (Show) -- | OutputUnion [Output] -- | OutputNonNull (Output) -data Input = InputScalar Scalar - | InputField Text - | InputList [Input] - deriving (Show) - -field :: Input -> Maybe Text -field (InputField x) = Just x -field _ = Nothing +type Argument = (Text, Scalar) -fields :: [Input] -> [Text] -fields = catMaybes . fmap field +data Input = InputField Text [Argument] [Input] + deriving (Show) +-- TODO: Make ScalarInt Int32 data Scalar = ScalarInt Int | ScalarFloat Double | ScalarString Text @@ -43,3 +42,10 @@ instance ToJSON Scalar where toJSON (ScalarString x) = toJSON x toJSON (ScalarBoolean x) = toJSON x toJSON (ScalarID x) = toJSON x + +instance ToJSON Output where + toJSON (OutputObject x) = toJSON $ toJSON <$> x + toJSON (OutputList x) = toJSON $ toJSON <$> x + toJSON (OutputScalar x) = toJSON x + toJSON (OutputEnum x) = toJSON x + -- cgit v1.2.3