getUnion3Encoder<T0, T1, T2> function

Encoder<Union3<T0, T1, T2>> getUnion3Encoder<T0, T1, T2>(
  1. Encoder<T0> variant0,
  2. Encoder<T1> variant1,
  3. Encoder<T2> variant2
)

Returns an encoder for a three-variant typed union.

Implementation

Encoder<Union3<T0, T1, T2>> getUnion3Encoder<T0, T1, T2>(
  Encoder<T0> variant0,
  Encoder<T1> variant1,
  Encoder<T2> variant2,
) {
  final variants = <Object>[variant0, variant1, variant2];
  final fixedSize = _getUnionFixedSize(variants);

  int writeImpl(Union3<T0, T1, T2> variant, Uint8List bytes, int offset) {
    return switch (variant) {
      Union3Variant0<T0, T1, T2>(:final value) => variant0.write(
        value,
        bytes,
        offset,
      ),
      Union3Variant1<T0, T1, T2>(:final value) => variant1.write(
        value,
        bytes,
        offset,
      ),
      Union3Variant2<T0, T1, T2>(:final value) => variant2.write(
        value,
        bytes,
        offset,
      ),
    };
  }

  if (fixedSize != null) {
    return FixedSizeEncoder<Union3<T0, T1, T2>>(
      fixedSize: fixedSize,
      write: writeImpl,
    );
  }

  final maxSize = _getUnionMaxSize(variants);

  return VariableSizeEncoder<Union3<T0, T1, T2>>(
    getSizeFromValue: (variant) {
      return switch (variant) {
        Union3Variant0<T0, T1, T2>(:final value) => getEncodedSize(
          value,
          variant0,
        ),
        Union3Variant1<T0, T1, T2>(:final value) => getEncodedSize(
          value,
          variant1,
        ),
        Union3Variant2<T0, T1, T2>(:final value) => getEncodedSize(
          value,
          variant2,
        ),
      };
    },
    write: writeImpl,
    maxSize: maxSize,
  );
}