getMapCodec<K, V> function

Codec<Map<K, V>, Map<K, V>> getMapCodec<K, V>(
  1. Codec<K, K> key,
  2. Codec<V, V> value, {
  3. ArrayLikeCodecSize? size,
})

Returns a codec for encoding and decoding maps.

This codec serializes maps where the key/value pairs are encoded and decoded using the provided key and value codecs. Defaults to a u32 size prefix.

Implementation

Codec<Map<K, V>, Map<K, V>> getMapCodec<K, V>(
  Codec<K, K> key,
  Codec<V, V> value, {
  ArrayLikeCodecSize? size,
}) {
  // Split size config for encoder/decoder.
  final ArrayLikeCodecSize? encoderSize;
  final ArrayLikeCodecSize? decoderSize;
  if (size is PrefixedArraySize) {
    final prefix = size.prefix;
    if (prefix is Codec<BigInt, BigInt>) {
      // Wide integer prefixes use `BigInt`, which is not a `num` in Dart.
      encoderSize = PrefixedArraySize(encoderFromCodec(prefix));
      decoderSize = PrefixedArraySize(decoderFromCodec(prefix));
    } else if (prefix is Codec<num, num>) {
      encoderSize = PrefixedArraySize(encoderFromCodec(prefix));
      decoderSize = PrefixedArraySize(decoderFromCodec(prefix));
    } else {
      encoderSize = size;
      decoderSize = size;
    }
  } else {
    encoderSize = size;
    decoderSize = size;
  }

  return combineCodec(
    getMapEncoder<K, V>(
      encoderFromCodec(key),
      encoderFromCodec(value),
      size: encoderSize,
    ),
    getMapDecoder<K, V>(
      decoderFromCodec(key),
      decoderFromCodec(value),
      size: decoderSize,
    ),
  );
}