2018-08-03 22:01:36 +00:00
|
|
|
part of graphql_schema.src.schema;
|
|
|
|
|
2018-08-03 22:41:13 +00:00
|
|
|
GraphQLEnumType enumType<Value>(String name, Map<String, Value> values,
|
2018-08-03 22:10:29 +00:00
|
|
|
{String description}) {
|
2018-08-03 22:41:13 +00:00
|
|
|
return new GraphQLEnumType<Value>(
|
|
|
|
name, values.keys.map((k) => new GraphQLEnumValue(k, values[k])).toList(),
|
2018-08-03 22:10:29 +00:00
|
|
|
description: description);
|
|
|
|
}
|
|
|
|
|
2018-08-03 22:41:13 +00:00
|
|
|
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;
|
2018-08-03 22:41:13 +00:00
|
|
|
final List<GraphQLEnumValue<Value>> values;
|
2018-08-03 22:01:36 +00:00
|
|
|
final String description;
|
|
|
|
|
2018-08-03 22:41:13 +00:00
|
|
|
GraphQLEnumType(this.name, this.values, {this.description});
|
2018-08-03 22:01:36 +00:00
|
|
|
|
|
|
|
@override
|
2018-08-03 22:41:13 +00:00
|
|
|
String serialize(Value value) {
|
2018-08-03 22:42:35 +00:00
|
|
|
if (value == null) return null;
|
2018-08-03 22:41:13 +00:00
|
|
|
return values.firstWhere((v) => v.value == value).name;
|
|
|
|
}
|
2018-08-03 22:01:36 +00:00
|
|
|
|
2018-08-03 22:41:13 +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)) {
|
2018-08-04 19:18:53 +00:00
|
|
|
if (input == null) {
|
|
|
|
return new ValidationResult<String>._failure(
|
|
|
|
['The enum "$name" does not accept null values.']);
|
|
|
|
}
|
|
|
|
|
2018-08-03 22:41:13 +00:00
|
|
|
return new ValidationResult<String>._failure(
|
|
|
|
['"$input" is not a valid value for the enum "$name".']);
|
2018-08-03 22:01:36 +00:00
|
|
|
}
|
|
|
|
|
2018-08-03 22:41:13 +00:00
|
|
|
return new ValidationResult<String>._ok(input);
|
2018-08-03 22:01:36 +00:00
|
|
|
}
|
2018-08-04 19:18:53 +00:00
|
|
|
|
|
|
|
@override
|
|
|
|
bool operator ==(other) =>
|
|
|
|
other is GraphQLEnumType &&
|
|
|
|
other.name == name &&
|
|
|
|
other.description == description &&
|
|
|
|
const ListEquality<GraphQLEnumValue>().equals(other.values, values);
|
|
|
|
|
|
|
|
@override
|
|
|
|
GraphQLType<Value, String> coerceToInputObject() => this;
|
2018-08-03 22:01:36 +00:00
|
|
|
}
|
2018-08-03 22:10:29 +00:00
|
|
|
|
2018-08-03 22:41:13 +00:00
|
|
|
class GraphQLEnumValue<Value> {
|
2018-08-03 22:10:29 +00:00
|
|
|
final String name;
|
2018-08-03 22:41:13 +00:00
|
|
|
final Value value;
|
2018-08-03 22:54:12 +00:00
|
|
|
final String description;
|
2018-08-03 22:10:29 +00:00
|
|
|
final String deprecationReason;
|
|
|
|
|
2018-08-04 19:18:53 +00:00
|
|
|
GraphQLEnumValue(this.name, this.value,
|
|
|
|
{this.description, this.deprecationReason});
|
2018-08-03 22:10:29 +00:00
|
|
|
|
|
|
|
bool get isDeprecated => deprecationReason != null;
|
|
|
|
|
|
|
|
@override
|
2018-08-04 19:18:53 +00:00
|
|
|
bool operator ==(other) =>
|
|
|
|
other is GraphQLEnumValue &&
|
|
|
|
other.name == name &&
|
|
|
|
other.value == value &&
|
|
|
|
other.description == description &&
|
|
|
|
other.deprecationReason == deprecationReason;
|
2018-08-03 22:10:29 +00:00
|
|
|
}
|