requestSchema function
Implementation
Future<IList<GraphQLTypeDeclaration>> requestSchema(Uri uri) async {
final response = await graphQLPost(query: '''
query IntrospectionQuery {
__schema {
queryType { name }
mutationType { name }
subscriptionType { name }
types {
...FullType
}
directives {
name
description
locations
args {
...InputValue
}
}
}
}
fragment FullType on __Type {
kind
name
description
fields(includeDeprecated: true) {
name
description
args {
...InputValue
}
type {
...TypeRef
}
isDeprecated
deprecationReason
}
inputFields {
...InputValue
}
interfaces {
...TypeRef
}
enumValues(includeDeprecated: true) {
name
description
isDeprecated
deprecationReason
}
possibleTypes {
...TypeRef
}
}
fragment InputValue on __InputValue {
name
description
type { ...TypeRef }
defaultValue
}
fragment TypeRef on __Type {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
}
}
}
}
}
}
}
}
''', uri: uri);
final data = response.data;
if (data == null) {
throw Exception('data is null');
}
final schema = data.getValueByKeyOrThrow('__schema');
final queryTypeName = schema
.getObjectValueOrThrow('queryType')
.getObjectValueOrThrow('name')
.asStringOrThrow();
final mutationTypeName = schema
.getObjectValueOrThrow('mutationType')
.getObjectValueOrThrow('name')
.asStringOrThrow();
final typeList = schema.getObjectValueOrThrow('types');
return IList(
typeList.getAsArrayWithDecoder(
(v) => _graphQLTypeToDartClassDeclaration(
value: v,
queryTypeName: queryTypeName,
mutationTypeName: mutationTypeName,
),
),
);
}