@@ -20,7 +20,7 @@ module GraphQL.Introspection
20
20
, serialize
21
21
) where
22
22
23
- import Protolude hiding (TypeError )
23
+ import Protolude hiding (TypeError , Enum )
24
24
25
25
import qualified Data.List.NonEmpty as NonEmpty
26
26
import qualified Data.Map as Map
@@ -43,15 +43,39 @@ type Schema__ = Object "__Schema" '[]
43
43
]
44
44
45
45
type Type__ = Object " __Type" '[]
46
- '[ Field " kind" Text -- TODO: enum
46
+ '[ Field " kind" TypeKind__
47
47
, 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__ ))
49
51
]
50
52
51
53
type Field__ = Object " __Field" '[]
52
54
'[ Field " name" Text
55
+ , Field " args" (List InputValue__ )
53
56
]
54
57
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
+
55
79
type SchemaField = Field " __schema" Schema__
56
80
type TypeField = Argument " name" Text :> Field " __type" Type__
57
81
@@ -64,7 +88,7 @@ schemaDefinedTypes (SchemaDefinition queries mutations) =
64
88
defined name _ = not $ reserved name
65
89
66
90
reserved :: Name -> Bool
67
- reserved name = " __" `T.isPrefixOf` unName name
91
+ reserved name = " __" `T.isPrefixOf` unName name
68
92
69
93
serialize :: forall s h q m .
70
94
( s ~ SchemaRoot h q m
@@ -83,15 +107,14 @@ serialize = do
83
107
collectDefinitions :: ObjectTypeDefinition -> [TypeDefinition ]
84
108
collectDefinitions = visitObject
85
109
where
86
- visitObject (ObjectTypeDefinition name interfaces fields) =
110
+ visitObject (ObjectTypeDefinition name interfaces fields) =
87
111
if reserved name
88
112
then []
89
- else
90
- -- FIXME:
113
+ else
91
114
let fields' = NonEmpty. fromList $ NonEmpty. filter (not . reserved . getName) fields
92
115
in TypeDefinitionObject (ObjectTypeDefinition name interfaces fields') : concatMap visitField fields'
93
116
94
- visitField (FieldDefinition _ args out) =
117
+ visitField (FieldDefinition _ args out) =
95
118
visitType out <> concatMap visitArg args
96
119
97
120
visitArg (ArgumentDefinition _ input _) = case unAnnotatedType input of
@@ -153,31 +176,31 @@ inputObjectFieldDefinitionToAST :: InputObjectFieldDefinition -> AST.InputValueD
153
176
inputObjectFieldDefinitionToAST (InputObjectFieldDefinition name annotatedInput _) = AST. InputValueDefinition name (inputTypeToAST annotatedInput) Nothing -- FIXME
154
177
155
178
typeToAST :: AnnotatedType GType -> AST. GType
156
- typeToAST (TypeNamed t) =
179
+ typeToAST (TypeNamed t) =
157
180
-- AST.TypeNamed $ AST.NamedType $ getName t
158
181
AST. TypeNonNull $ AST. NonNullTypeNamed $ AST. NamedType $ getName t
159
- typeToAST (TypeList (ListType t)) =
182
+ typeToAST (TypeList (ListType t)) =
160
183
-- AST.TypeList $ AST.ListType $ AST.TypeNamed $ AST.NamedType $ getName t
161
- AST. TypeNonNull $ AST. NonNullTypeList $ AST. ListType $
184
+ AST. TypeNonNull $ AST. NonNullTypeList $ AST. ListType $
162
185
-- AST.TypeNamed $ AST.NamedType $ getName t
163
186
AST. TypeNonNull $ AST. NonNullTypeNamed $ AST. NamedType $ getName t
164
- typeToAST (TypeNonNull (NonNullTypeNamed t)) =
187
+ typeToAST (TypeNonNull (NonNullTypeNamed t)) =
165
188
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 $
168
191
-- AST.TypeNamed $ AST.NamedType $ getName t
169
192
AST. TypeNonNull $ AST. NonNullTypeNamed $ AST. NamedType $ getName t
170
193
171
194
inputTypeToAST :: AnnotatedType InputType -> AST. GType
172
- inputTypeToAST (TypeNamed t) =
195
+ inputTypeToAST (TypeNamed t) =
173
196
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 $
176
199
AST. TypeNamed $ AST. NamedType $ getName t
177
- inputTypeToAST (TypeNonNull (NonNullTypeNamed t)) =
200
+ inputTypeToAST (TypeNonNull (NonNullTypeNamed t)) =
178
201
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 $
181
204
AST. TypeNamed $ AST. NamedType $ getName t
182
205
183
206
schema :: forall s m queries mutations .
@@ -220,43 +243,56 @@ typeHandler (TypeDefinitionTypeExtension ex) = typeExtensionTypeHandler ex
220
243
221
244
objectTypeHandler :: Monad m => ObjectTypeDefinition -> Handler m Type__
222
245
objectTypeHandler (ObjectTypeDefinition name _ fields) = pure
223
- $ pure " OBJECT"
246
+ $ pure OBJECT
224
247
:<> 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
226
251
227
252
enumTypeHandler :: Monad m => EnumTypeDefinition -> Handler m Type__
228
- enumTypeHandler (EnumTypeDefinition name _ ) = pure
229
- $ pure " ENUM"
253
+ enumTypeHandler (EnumTypeDefinition name values ) = pure
254
+ $ pure ENUM
230
255
:<> pure (unName name)
231
- :<> pure [] -- fields
256
+ :<> pure Nothing
257
+ :<> pure (Just . pure $ map (pure . pure . unName . getName) values)
258
+ :<> pure Nothing
232
259
233
260
unionTypeHandler :: Monad m => UnionTypeDefinition -> Handler m Type__
234
261
unionTypeHandler (UnionTypeDefinition name _) = pure
235
- $ pure " UNION"
262
+ $ pure UNION
236
263
:<> pure (unName name)
237
- :<> pure []
264
+ :<> pure Nothing
265
+ :<> pure Nothing
266
+ :<> pure Nothing
238
267
239
268
interfaceTypeHandler :: Monad m => InterfaceTypeDefinition -> Handler m Type__
240
269
interfaceTypeHandler (InterfaceTypeDefinition name fields) = pure
241
- $ pure " UNION "
270
+ $ pure INTERFACE
242
271
:<> 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
244
275
245
276
scalarTypeHandler :: Monad m => ScalarTypeDefinition -> Handler m Type__
246
277
scalarTypeHandler (ScalarTypeDefinition name) = pure
247
- $ pure " SCALAR"
278
+ $ pure SCALAR
248
279
:<> pure (unName name)
249
- :<> pure []
280
+ :<> pure Nothing
281
+ :<> pure Nothing
282
+ :<> pure Nothing
250
283
251
284
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
254
287
:<> pure (unName name)
255
- :<> pure []
288
+ :<> pure Nothing
289
+ :<> pure Nothing
290
+ :<> pure (Just . pure $ map (pure . pure . unName . getName) $ NonEmpty. toList fields)
256
291
257
292
typeExtensionTypeHandler :: Monad m => TypeExtensionDefinition -> Handler m Type__
258
293
typeExtensionTypeHandler (TypeExtensionDefinition obj) = objectTypeHandler obj
259
294
260
295
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