platform/packages/graphql/graphql_schema/lib/src/scalar.dart
Tobe O 4e69153e3e Add 'packages/graphql/' from commit '33e2f86ba73d559197b6270df036256104726aca'
git-subtree-dir: packages/graphql
git-subtree-mainline: ac29392d7f
git-subtree-split: 33e2f86ba7
2020-02-15 18:22:07 -05:00

158 lines
4.3 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

part of graphql_schema.src.schema;
/// `true` or `false`.
final GraphQLScalarType<bool, bool> graphQLBoolean = new _GraphQLBoolType();
/// A UTF8 character sequence.
final GraphQLScalarType<String, String> graphQLString =
new _GraphQLStringType._();
/// The ID scalar type represents a unique identifier, often used to re-fetch an object or as the key for a cache.
///
/// The ID type is serialized in the same way as a String; however, defining it as an ID signifies that it is not intended to be humanreadable.
final GraphQLScalarType<String, String> graphQLId =
new _GraphQLStringType._('ID');
/// A [DateTime], serialized as an ISO-8601 string..
final GraphQLScalarType<DateTime, String> graphQLDate =
new _GraphQLDateType._();
/// A signed 32bit integer.
final GraphQLScalarType<int, int> graphQLInt = new _GraphQLNumType<int>(
'Int', 'A signed 64-bit integer.', (x) => x is int, 'an integer');
/// A signed double-precision floating-point value.
final GraphQLScalarType<double, double> graphQLFloat =
new _GraphQLNumType<double>(
'Float',
'A signed double-precision floating-point value.',
(x) => x is double,
'a float');
abstract class GraphQLScalarType<Value, Serialized>
extends GraphQLType<Value, Serialized>
with _NonNullableMixin<Value, Serialized> {
Type get valueType => Value;
}
typedef bool _NumVerifier(x);
class _GraphQLBoolType extends GraphQLScalarType<bool, bool> {
@override
bool serialize(bool value) {
return value;
}
@override
String get name => 'Boolean';
@override
String get description => 'A boolean value; can be either true or false.';
@override
ValidationResult<bool> validate(String key, input) {
if (input != null && input is! bool)
return new ValidationResult._failure(
['Expected "$key" to be a boolean.']);
return new ValidationResult._ok(input);
}
@override
bool deserialize(bool serialized) {
return serialized;
}
@override
GraphQLType<bool, bool> coerceToInputObject() => this;
}
class _GraphQLNumType<T extends num> extends GraphQLScalarType<T, T> {
final String name;
final String description;
final _NumVerifier verifier;
final String expected;
_GraphQLNumType(this.name, this.description, this.verifier, this.expected);
@override
ValidationResult<T> validate(String key, input) {
if (input != null && !verifier(input))
return new ValidationResult._failure(
['Expected "$key" to be $expected.']);
return new ValidationResult._ok(input);
}
@override
T deserialize(T serialized) {
return serialized;
}
@override
T serialize(T value) {
return value;
}
@override
GraphQLType<T, T> coerceToInputObject() => this;
}
class _GraphQLStringType extends GraphQLScalarType<String, String> {
final String name;
_GraphQLStringType._([this.name = 'String']);
@override
String get description => 'A character sequence.';
@override
String serialize(String value) => value;
@override
String deserialize(String serialized) => serialized;
@override
ValidationResult<String> validate(String key, input) =>
input == null || input is String
? new ValidationResult<String>._ok(input)
: new ValidationResult._failure(['Expected "$key" to be a string.']);
@override
GraphQLType<String, String> coerceToInputObject() => this;
}
class _GraphQLDateType extends GraphQLScalarType<DateTime, String>
with _NonNullableMixin<DateTime, String> {
_GraphQLDateType._();
@override
String get name => 'Date';
@override
String get description => 'An ISO-8601 Date.';
@override
String serialize(DateTime value) => value.toIso8601String();
@override
DateTime deserialize(String serialized) => DateTime.parse(serialized);
@override
ValidationResult<String> validate(String key, input) {
if (input != null && input is! String)
return new ValidationResult<String>._failure(
['$key must be an ISO 8601-formatted date string.']);
else if (input == null) return new ValidationResult<String>._ok(input);
try {
DateTime.parse(input);
return new ValidationResult<String>._ok(input);
} on FormatException {
return new ValidationResult<String>._failure(
['$key must be an ISO 8601-formatted date string.']);
}
}
@override
GraphQLType<DateTime, String> coerceToInputObject() => this;
}