@@ -20,7 +20,7 @@ module GraphQL.Introspection
2020 , serialize
2121 ) where
2222
23- import Protolude hiding (TypeError )
23+ import Protolude hiding (TypeError , Enum )
2424
2525import qualified Data.List.NonEmpty as NonEmpty
2626import qualified Data.Map as Map
@@ -43,15 +43,39 @@ type Schema__ = Object "__Schema" '[]
4343 ]
4444
4545type 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
5153type 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+
5579type SchemaField = Field " __schema" Schema__
5680type TypeField = Argument " name" Text :> Field " __type" Type__
5781
@@ -64,7 +88,7 @@ schemaDefinedTypes (SchemaDefinition queries mutations) =
6488 defined name _ = not $ reserved name
6589
6690reserved :: Name -> Bool
67- reserved name = " __" `T.isPrefixOf` unName name
91+ reserved name = " __" `T.isPrefixOf` unName name
6892
6993serialize :: forall s h q m .
7094 ( s ~ SchemaRoot h q m
@@ -83,15 +107,14 @@ serialize = do
83107collectDefinitions :: ObjectTypeDefinition -> [TypeDefinition ]
84108collectDefinitions = 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
153176inputObjectFieldDefinitionToAST (InputObjectFieldDefinition name annotatedInput _) = AST. InputValueDefinition name (inputTypeToAST annotatedInput) Nothing -- FIXME
154177
155178typeToAST :: 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
171194inputTypeToAST :: 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
183206schema :: forall s m queries mutations .
@@ -220,43 +243,56 @@ typeHandler (TypeDefinitionTypeExtension ex) = typeExtensionTypeHandler ex
220243
221244objectTypeHandler :: Monad m => ObjectTypeDefinition -> Handler m Type__
222245objectTypeHandler (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
227252enumTypeHandler :: 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
233260unionTypeHandler :: Monad m => UnionTypeDefinition -> Handler m Type__
234261unionTypeHandler (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
239268interfaceTypeHandler :: Monad m => InterfaceTypeDefinition -> Handler m Type__
240269interfaceTypeHandler (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
245276scalarTypeHandler :: Monad m => ScalarTypeDefinition -> Handler m Type__
246277scalarTypeHandler (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
251284inputObjectTypeHandler :: 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
257292typeExtensionTypeHandler :: Monad m => TypeExtensionDefinition -> Handler m Type__
258293typeExtensionTypeHandler (TypeExtensionDefinition obj) = objectTypeHandler obj
259294
260295fieldHandler :: 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