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