in lib/src/grpc_api_impl/datastore_impl.dart [573:616]
Value encodeValue(value, [bool excludeFromIndexes = false]) {
final pb = Value();
if (value is bool) {
pb.booleanValue = value;
if (excludeFromIndexes) pb.excludeFromIndexes = true;
} else if (value is String) {
pb.stringValue = value;
if (excludeFromIndexes) pb.excludeFromIndexes = true;
} else if (value is int) {
pb.integerValue = Int64(value);
if (excludeFromIndexes) pb.excludeFromIndexes = true;
} else if (value is raw.BlobValue) {
pb.blobValue = value.bytes;
if (excludeFromIndexes) pb.excludeFromIndexes = true;
} else if (value is double) {
pb.doubleValue = value;
if (excludeFromIndexes) pb.excludeFromIndexes = true;
} else if (value is raw.Key) {
pb.keyValue = encodeKey(value, enforceId: true);
if (excludeFromIndexes) pb.excludeFromIndexes = true;
} else if (value == null) {
pb.nullValue = NullValue.NULL_VALUE;
if (excludeFromIndexes) pb.excludeFromIndexes = true;
} else if (value is DateTime) {
final int ms = value.millisecondsSinceEpoch;
final int seconds = ms ~/ 1000;
final int ns = 1000 * (value.microsecond + (ms % 1000) * 1000);
pb.timestampValue = Timestamp()
..seconds = (Int64(seconds))
..nanos = ns;
if (excludeFromIndexes) pb.excludeFromIndexes = true;
} else if (value is List) {
// For [ArrayValue]s we need to set the indexing-bit on the individual
// values, not on the array!
pb.arrayValue = ArrayValue()
..values.addAll(value.map((value) {
return encodeValue(value, excludeFromIndexes);
}));
} else {
throw raw.ApplicationError(
'Cannot encode unsupported ${value.runtimeType} type.');
}
return pb;
}