Skip to content

Commit 9b6a2a1

Browse files
committed
Introspect args, enumValues, inputFields
1 parent 3f67822 commit 9b6a2a1

File tree

5 files changed

+326
-97
lines changed

5 files changed

+326
-97
lines changed

graphql-api.cabal

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
--
33
-- see: https://github.com/sol/hpack
44
--
5-
-- hash: 796abb771a05858c20303db3e1ddd30cbdf11f24f02e09eed0fe8a9850c43269
5+
-- hash: 0aae3dfe62e79c389edba2fdfb743c340f8fc3401c67124aa1f623415db39ab8
66

77
name: graphql-api
88
version: 0.3.0
@@ -134,9 +134,11 @@ test-suite graphql-api-tests
134134
build-depends:
135135
QuickCheck
136136
, aeson
137+
, aeson-diff
137138
, aeson-qq
138139
, attoparsec
139140
, base >=4.9 && <5
141+
, bytestring
140142
, containers
141143
, directory
142144
, exceptions

package.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@ tests:
7171
- hspec
7272
- QuickCheck
7373
- raw-strings-qq
74+
- aeson-diff
7475
- aeson-qq
76+
- bytestring
7577
- tasty
7678
- tasty-hspec
7779
- template-haskell

src/GraphQL/Introspection.hs

+72-36
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ module GraphQL.Introspection
2020
, serialize
2121
) where
2222

23-
import Protolude hiding (TypeError)
23+
import Protolude hiding (TypeError, Enum)
2424

2525
import qualified Data.List.NonEmpty as NonEmpty
2626
import qualified Data.Map as Map
@@ -43,15 +43,39 @@ type Schema__ = Object "__Schema" '[]
4343
]
4444

4545
type Type__ = Object "__Type" '[]
46-
'[ Field "kind" Text -- TODO: enum
46+
'[ Field "kind" TypeKind__
4747
, Field "name" Text
48-
, Field "fields" (List Field__)
48+
, Field "fields" (Maybe (List Field__))
49+
, Field "enumValues" (Maybe (List EnumValue__))
50+
, Field "inputFields" (Maybe (List InputValue__))
4951
]
5052

5153
type Field__ = Object "__Field" '[]
5254
'[ Field "name" Text
55+
, Field "args" (List InputValue__)
5356
]
5457

58+
type EnumValue__ = Object "__EnumValue" '[]
59+
'[ Field "name" Text
60+
]
61+
62+
type InputValue__ = Object "__InputValue" '[]
63+
'[ Field "name" Text
64+
]
65+
66+
data TypeKind = SCALAR
67+
| OBJECT
68+
| INTERFACE
69+
| UNION
70+
| ENUM
71+
| INPUT_OBJECT
72+
| LIST
73+
| NON_NULL
74+
deriving (Show, Eq, Generic)
75+
instance GraphQLEnum TypeKind
76+
77+
type TypeKind__ = Enum "__TypeKind" TypeKind
78+
5579
type SchemaField = Field "__schema" Schema__
5680
type TypeField = Argument "name" Text :> Field "__type" Type__
5781

@@ -64,7 +88,7 @@ schemaDefinedTypes (SchemaDefinition queries mutations) =
6488
defined name _ = not $ reserved name
6589

6690
reserved :: Name -> Bool
67-
reserved name = "__" `T.isPrefixOf` unName name
91+
reserved name = "__" `T.isPrefixOf` unName name
6892

6993
serialize :: forall s h q m.
7094
( s ~ SchemaRoot h q m
@@ -83,15 +107,14 @@ serialize = do
83107
collectDefinitions :: ObjectTypeDefinition -> [TypeDefinition]
84108
collectDefinitions = visitObject
85109
where
86-
visitObject (ObjectTypeDefinition name interfaces fields) =
110+
visitObject (ObjectTypeDefinition name interfaces fields) =
87111
if reserved name
88112
then []
89-
else
90-
-- FIXME:
113+
else
91114
let fields' = NonEmpty.fromList $ NonEmpty.filter (not . reserved . getName) fields
92115
in TypeDefinitionObject (ObjectTypeDefinition name interfaces fields') : concatMap visitField fields'
93116

94-
visitField (FieldDefinition _ args out) =
117+
visitField (FieldDefinition _ args out) =
95118
visitType out <> concatMap visitArg args
96119

97120
visitArg (ArgumentDefinition _ input _) = case unAnnotatedType input of
@@ -153,31 +176,31 @@ inputObjectFieldDefinitionToAST :: InputObjectFieldDefinition -> AST.InputValueD
153176
inputObjectFieldDefinitionToAST (InputObjectFieldDefinition name annotatedInput _) = AST.InputValueDefinition name (inputTypeToAST annotatedInput) Nothing -- FIXME
154177

155178
typeToAST :: AnnotatedType GType -> AST.GType
156-
typeToAST (TypeNamed t) =
179+
typeToAST (TypeNamed t) =
157180
-- AST.TypeNamed $ AST.NamedType $ getName t
158181
AST.TypeNonNull $ AST.NonNullTypeNamed $ AST.NamedType $ getName t
159-
typeToAST (TypeList (ListType t)) =
182+
typeToAST (TypeList (ListType t)) =
160183
-- AST.TypeList $ AST.ListType $ AST.TypeNamed $ AST.NamedType $ getName t
161-
AST.TypeNonNull $ AST.NonNullTypeList $ AST.ListType $
184+
AST.TypeNonNull $ AST.NonNullTypeList $ AST.ListType $
162185
-- AST.TypeNamed $ AST.NamedType $ getName t
163186
AST.TypeNonNull $ AST.NonNullTypeNamed $ AST.NamedType $ getName t
164-
typeToAST (TypeNonNull (NonNullTypeNamed t)) =
187+
typeToAST (TypeNonNull (NonNullTypeNamed t)) =
165188
AST.TypeNonNull $ AST.NonNullTypeNamed $ AST.NamedType $ getName t
166-
typeToAST (TypeNonNull (NonNullTypeList (ListType t))) =
167-
AST.TypeNonNull $ AST.NonNullTypeList $ AST.ListType $
189+
typeToAST (TypeNonNull (NonNullTypeList (ListType t))) =
190+
AST.TypeNonNull $ AST.NonNullTypeList $ AST.ListType $
168191
-- AST.TypeNamed $ AST.NamedType $ getName t
169192
AST.TypeNonNull $ AST.NonNullTypeNamed $ AST.NamedType $ getName t
170193

171194
inputTypeToAST :: AnnotatedType InputType -> AST.GType
172-
inputTypeToAST (TypeNamed t) =
195+
inputTypeToAST (TypeNamed t) =
173196
AST.TypeNamed $ AST.NamedType $ getName t
174-
inputTypeToAST (TypeList (ListType t)) =
175-
AST.TypeNonNull $ AST.NonNullTypeList $ AST.ListType $
197+
inputTypeToAST (TypeList (ListType t)) =
198+
AST.TypeNonNull $ AST.NonNullTypeList $ AST.ListType $
176199
AST.TypeNamed $ AST.NamedType $ getName t
177-
inputTypeToAST (TypeNonNull (NonNullTypeNamed t)) =
200+
inputTypeToAST (TypeNonNull (NonNullTypeNamed t)) =
178201
AST.TypeNonNull $ AST.NonNullTypeNamed $ AST.NamedType $ getName t
179-
inputTypeToAST (TypeNonNull (NonNullTypeList (ListType t))) =
180-
AST.TypeNonNull $ AST.NonNullTypeList $ AST.ListType $
202+
inputTypeToAST (TypeNonNull (NonNullTypeList (ListType t))) =
203+
AST.TypeNonNull $ AST.NonNullTypeList $ AST.ListType $
181204
AST.TypeNamed $ AST.NamedType $ getName t
182205

183206
schema :: forall s m queries mutations.
@@ -220,43 +243,56 @@ typeHandler (TypeDefinitionTypeExtension ex) = typeExtensionTypeHandler ex
220243

221244
objectTypeHandler :: Monad m => ObjectTypeDefinition -> Handler m Type__
222245
objectTypeHandler (ObjectTypeDefinition name _ fields) = pure
223-
$ pure "OBJECT"
246+
$ pure OBJECT
224247
:<> pure (unName name)
225-
:<> pure (map fieldHandler $ NonEmpty.toList fields)
248+
:<> pure (Just . pure $ map fieldHandler $ NonEmpty.toList fields)
249+
:<> pure Nothing
250+
:<> pure Nothing
226251

227252
enumTypeHandler :: Monad m => EnumTypeDefinition -> Handler m Type__
228-
enumTypeHandler (EnumTypeDefinition name _) = pure
229-
$ pure "ENUM"
253+
enumTypeHandler (EnumTypeDefinition name values) = pure
254+
$ pure ENUM
230255
:<> pure (unName name)
231-
:<> pure [] -- fields
256+
:<> pure Nothing
257+
:<> pure (Just . pure $ map (pure . pure . unName . getName) values)
258+
:<> pure Nothing
232259

233260
unionTypeHandler :: Monad m => UnionTypeDefinition -> Handler m Type__
234261
unionTypeHandler (UnionTypeDefinition name _) = pure
235-
$ pure "UNION"
262+
$ pure UNION
236263
:<> pure (unName name)
237-
:<> pure []
264+
:<> pure Nothing
265+
:<> pure Nothing
266+
:<> pure Nothing
238267

239268
interfaceTypeHandler :: Monad m => InterfaceTypeDefinition -> Handler m Type__
240269
interfaceTypeHandler (InterfaceTypeDefinition name fields) = pure
241-
$ pure "UNION"
270+
$ pure INTERFACE
242271
:<> pure (unName name)
243-
:<> pure (map fieldHandler $ NonEmpty.toList fields)
272+
:<> pure (Just . pure $ map fieldHandler $ NonEmpty.toList fields)
273+
:<> pure Nothing
274+
:<> pure Nothing
244275

245276
scalarTypeHandler :: Monad m => ScalarTypeDefinition -> Handler m Type__
246277
scalarTypeHandler (ScalarTypeDefinition name) = pure
247-
$ pure "SCALAR"
278+
$ pure SCALAR
248279
:<> pure (unName name)
249-
:<> pure []
280+
:<> pure Nothing
281+
:<> pure Nothing
282+
:<> pure Nothing
250283

251284
inputObjectTypeHandler :: Monad m => InputObjectTypeDefinition -> Handler m Type__
252-
inputObjectTypeHandler (InputObjectTypeDefinition name _) = pure
253-
$ pure "INPUT_OBJECT"
285+
inputObjectTypeHandler (InputObjectTypeDefinition name fields) = pure
286+
$ pure INPUT_OBJECT
254287
:<> pure (unName name)
255-
:<> pure []
288+
:<> pure Nothing
289+
:<> pure Nothing
290+
:<> pure (Just . pure $ map (pure . pure . unName . getName) $ NonEmpty.toList fields)
256291

257292
typeExtensionTypeHandler :: Monad m => TypeExtensionDefinition -> Handler m Type__
258293
typeExtensionTypeHandler (TypeExtensionDefinition obj) = objectTypeHandler obj
259294

260295
fieldHandler :: Monad m => FieldDefinition -> Handler m Field__
261-
fieldHandler (FieldDefinition name _ _) = pure
262-
$ pure (unName name)
296+
fieldHandler (FieldDefinition name args _) = pure
297+
$ pure (unName name)
298+
:<> pure (map (pure . pure . unName . getName) args)

0 commit comments

Comments
 (0)