Introspection supports union types

This commit is contained in:
Tobe O 2018-08-03 20:22:50 -04:00
parent c69a53457f
commit 65bba97f1a
3 changed files with 29 additions and 3 deletions

View file

@ -19,6 +19,8 @@ part 'scalar.dart';
part 'type.dart'; part 'type.dart';
part 'union.dart';
part 'validation_result.dart'; part 'validation_result.dart';
class GraphQLSchema { class GraphQLSchema {

View file

@ -0,0 +1,18 @@
part of graphql_schema.src.schema;
class GraphQLUnionType<Value, Serialized> extends GraphQLType<Value, Serialized>
with
_NonNullableMixin<Value, Serialized> {
final List<GraphQLType<Value, Serialized>> possibleTypes;
final String description;
GraphQLUnionType(this.possibleTypes, {this.description}) {
assert(possibleTypes.every((
t) => t is GraphQLUnionType), 'The member types of a Union type must all be Object base types; Scalar, Interface and Union types may not be member types of a Union. Similarly, wrapping types may not be member types of a Union');
assert(possibleTypes
.isNotEmpty, 'A Union type must define one or more member types');
}
@override
String get name => possibleTypes.map((t) => t.name).join(' | ')
}

View file

@ -122,6 +122,8 @@ GraphQLObjectType _reflectSchemaTypes() {
resolve: (type, _) { resolve: (type, _) {
if (type is GraphQLObjectType && type.isInterface) { if (type is GraphQLObjectType && type.isInterface) {
return type.possibleTypes; return type.possibleTypes;
} else if (type is GraphQLUnionType) {
return type.possibleTypes;
} else { } else {
return null; return null;
} }
@ -205,9 +207,11 @@ GraphQLObjectType _createTypeType() {
return 'NON_NULL'; return 'NON_NULL';
else if (t is GraphQLEnumType) else if (t is GraphQLEnumType)
return 'ENUM'; return 'ENUM';
else if (t is GraphQLUnionType)
return 'UNION';
else else
throw new UnsupportedError( throw new UnsupportedError(
'Cannot get the kind of $t.'); // TODO: union 'Cannot get the kind of $t.');
}, },
), ),
field( field(
@ -445,8 +449,10 @@ Iterable<GraphQLType> _fetchAllTypesFromType(GraphQLType type) {
types.addAll(_fetchAllTypesFromObject(type)); types.addAll(_fetchAllTypesFromObject(type));
} else if (type is GraphQLEnumType) { } else if (type is GraphQLEnumType) {
types.add(type); types.add(type);
} else if ( type is GraphQLUnionType) {
for (var t in type.possibleTypes) {
types.addAll(_fetchAllTypesFromType(t));
}
} }
// TODO: union
return types; return types;
} }