platform/graphql_schema/lib/src/enum.dart

60 lines
1.7 KiB
Dart
Raw Normal View History

2018-08-03 22:01:36 +00:00
part of graphql_schema.src.schema;
GraphQLEnumType enumType<Value>(String name, Map<String, Value> values,
{String description}) {
return new GraphQLEnumType<Value>(
name, values.keys.map((k) => new GraphQLEnumValue(k, values[k])).toList(),
description: description);
}
GraphQLEnumType enumTypeFromStrings(String name, List<String> values,
{String description}) {
return new GraphQLEnumType<String>(
name, values.map((s) => new GraphQLEnumValue(s, s)).toList(),
description: description);
}
class GraphQLEnumType<Value> extends GraphQLScalarType<Value, String>
with _NonNullableMixin<Value, String> {
2018-08-03 22:01:36 +00:00
final String name;
final List<GraphQLEnumValue<Value>> values;
2018-08-03 22:01:36 +00:00
final String description;
GraphQLEnumType(this.name, this.values, {this.description});
2018-08-03 22:01:36 +00:00
@override
String serialize(Value value) {
if (value == null) return null;
return values.firstWhere((v) => v.value == value).name;
}
2018-08-03 22:01:36 +00:00
@override
Value deserialize(String serialized) {
return values.firstWhere((v) => v.name == serialized).value;
}
@override
ValidationResult<String> validate(String key, String input) {
if (!values.any((v) => v.name == input)) {
return new ValidationResult<String>._failure(
['"$input" is not a valid value for the enum "$name".']);
2018-08-03 22:01:36 +00:00
}
return new ValidationResult<String>._ok(input);
2018-08-03 22:01:36 +00:00
}
}
class GraphQLEnumValue<Value> {
final String name;
final Value value;
2018-08-03 22:54:12 +00:00
final String description;
final String deprecationReason;
2018-08-03 22:54:12 +00:00
GraphQLEnumValue(this.name, this.value, {this.description, this.deprecationReason});
bool get isDeprecated => deprecationReason != null;
@override
bool operator ==(other) => other is GraphQLEnumValue && other.name == name;
}