use super::*;
impl<N: Network> ToBits for Plaintext<N> {
fn write_bits_le(&self, vec: &mut Vec<bool>) {
match self {
Self::Literal(literal, bits_le) => {
let bits = bits_le.get_or_init(|| {
let mut bits_le = vec![false, false]; literal.variant().write_bits_le(&mut bits_le);
literal.size_in_bits().write_bits_le(&mut bits_le);
literal.write_bits_le(&mut bits_le);
bits_le
});
vec.extend_from_slice(bits)
}
Self::Struct(struct_, bits_le) => {
let bits = bits_le.get_or_init(|| {
let mut bits_le = vec![false, true];
u8::try_from(struct_.len())
.or_halt_with::<N>("Plaintext struct length exceeds u8::MAX")
.write_bits_le(&mut bits_le);
for (identifier, value) in struct_ {
identifier.size_in_bits().write_bits_le(&mut bits_le);
identifier.write_bits_le(&mut bits_le);
let value_bits = value.to_bits_le();
u16::try_from(value_bits.len())
.or_halt_with::<N>("Plaintext member exceeds u16::MAX bits")
.write_bits_le(&mut bits_le);
bits_le.extend_from_slice(&value_bits);
}
bits_le
});
vec.extend_from_slice(bits)
}
Self::Array(array, bits_le) => {
let bits = bits_le.get_or_init(|| {
let mut bits_le = vec![true, false];
u32::try_from(array.len())
.or_halt_with::<N>("Plaintext array length exceeds u32::MAX")
.write_bits_le(&mut bits_le);
for element in array {
let element_bits = element.to_bits_le();
u16::try_from(element_bits.len())
.or_halt_with::<N>("Plaintext element exceeds u16::MAX bits")
.write_bits_le(&mut bits_le);
bits_le.extend(element_bits);
}
bits_le
});
vec.extend_from_slice(bits)
}
}
}
fn write_bits_be(&self, vec: &mut Vec<bool>) {
match self {
Self::Literal(literal, bits_be) => {
let bits = bits_be.get_or_init(|| {
let mut bits_be = vec![false, false]; literal.variant().write_bits_be(&mut bits_be);
literal.size_in_bits().write_bits_be(&mut bits_be);
literal.write_bits_be(&mut bits_be);
bits_be
});
vec.extend_from_slice(bits)
}
Self::Struct(struct_, bits_be) => {
let bits = bits_be.get_or_init(|| {
let mut bits_be = vec![false, true];
u8::try_from(struct_.len())
.or_halt_with::<N>("Plaintext struct length exceeds u8::MAX")
.write_bits_be(&mut bits_be);
for (identifier, value) in struct_ {
identifier.size_in_bits().write_bits_be(&mut bits_be);
identifier.write_bits_be(&mut bits_be);
let value_bits = value.to_bits_be();
u16::try_from(value_bits.len())
.or_halt_with::<N>("Plaintext member exceeds u16::MAX bits")
.write_bits_be(&mut bits_be);
bits_be.extend_from_slice(&value_bits);
}
bits_be
});
vec.extend_from_slice(bits)
}
Self::Array(array, bits_be) => {
let bits = bits_be.get_or_init(|| {
let mut bits_be = vec![true, false];
u32::try_from(array.len())
.or_halt_with::<N>("Plaintext array length exceeds u32::MAX")
.write_bits_be(&mut bits_be);
for element in array {
let element_bits = element.to_bits_be();
u16::try_from(element_bits.len())
.or_halt_with::<N>("Plaintext element exceeds u16::MAX bits")
.write_bits_be(&mut bits_be);
bits_be.extend(element_bits);
}
bits_be
});
vec.extend_from_slice(bits)
}
}
}
}