getUnion3Encoder<T0, T1, T2> function
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,
);
}