encode method

Object? encode(
  1. Object? value
)

Converts value to JSON-compatible values with tagged extensions.

Implementation

Object? encode(Object? value) {
  if (value == null || value is bool || value is num || value is String) {
    if (value is double && !value.isFinite) {
      throw ArgumentError('Cannot serialize a non-finite double.');
    }
    return value;
  }
  for (final adapter in _adapters) {
    if (adapter.canEncode(value)) {
      return <String, Object?>{
        r'$type': adapter.tag,
        r'$value': encode(adapter.encode(value, this)),
      };
    }
  }
  if (value is List) return value.map(encode).toList(growable: false);
  if (value is Iterable) return value.map(encode).toList(growable: false);
  if (value is Map) {
    if (value.keys.any((key) => key is! String)) {
      throw ArgumentError('Serialized maps require String keys.');
    }
    final encoded = value.map<String, Object?>(
      (key, item) => MapEntry(key as String, encode(item)),
    );
    if (encoded.containsKey(r'$type') && encoded.containsKey(r'$value')) {
      return <String, Object?>{
        r'$type': 'Map',
        r'$value': encoded.entries
            .map<Object?>((entry) => <Object?>[entry.key, entry.value])
            .toList(growable: false),
      };
    }
    return encoded;
  }
  throw ArgumentError.value(
    value,
    'value',
    'Register a SerializationAdapter for this type.',
  );
}