use super::*;
impl<N: Network> FromBits for Plaintext<N> {
fn from_bits_le(bits_le: &[bool]) -> Result<Self> {
let mut counter = 0;
let variant = [bits_le[counter], bits_le[counter + 1]];
counter += 2;
if variant == [false, false] {
let literal_variant = u8::from_bits_le(&bits_le[counter..counter + 8])?;
counter += 8;
let literal_size = u16::from_bits_le(&bits_le[counter..counter + 16])?;
counter += 16;
let literal = Literal::from_bits_le(literal_variant, &bits_le[counter..counter + literal_size as usize])?;
let cache = OnceCell::new();
match cache.set(bits_le.to_vec()) {
Ok(_) => Ok(Self::Literal(literal, cache)),
Err(_) => bail!("Failed to store the plaintext bits in the cache."),
}
}
else if variant == [false, true] {
let num_members = u8::from_bits_le(&bits_le[counter..counter + 8])?;
counter += 8;
let mut members = IndexMap::with_capacity(num_members as usize);
for _ in 0..num_members {
let identifier_size = u8::from_bits_le(&bits_le[counter..counter + 8])?;
counter += 8;
let identifier = Identifier::from_bits_le(&bits_le[counter..counter + identifier_size as usize])?;
counter += identifier_size as usize;
let member_size = u16::from_bits_le(&bits_le[counter..counter + 16])?;
counter += 16;
let value = Plaintext::from_bits_le(&bits_le[counter..counter + member_size as usize])?;
counter += member_size as usize;
if members.insert(identifier, value).is_some() {
bail!("Duplicate identifier in struct.");
}
}
let cache = OnceCell::new();
match cache.set(bits_le.to_vec()) {
Ok(_) => Ok(Self::Struct(members, cache)),
Err(_) => bail!("Failed to store the plaintext bits in the cache."),
}
}
else {
bail!("Unknown plaintext variant.");
}
}
fn from_bits_be(bits_be: &[bool]) -> Result<Self> {
let mut counter = 0;
let variant = [bits_be[counter], bits_be[counter + 1]];
counter += 2;
if variant == [false, false] {
let literal_variant = u8::from_bits_be(&bits_be[counter..counter + 8])?;
counter += 8;
let literal_size = u16::from_bits_be(&bits_be[counter..counter + 16])?;
counter += 16;
let literal = Literal::from_bits_be(literal_variant, &bits_be[counter..counter + literal_size as usize])?;
let cache = OnceCell::new();
match cache.set(bits_be.to_vec()) {
Ok(_) => Ok(Self::Literal(literal, cache)),
Err(_) => bail!("Failed to store the plaintext bits in the cache."),
}
}
else if variant == [false, true] {
let num_members = u8::from_bits_be(&bits_be[counter..counter + 8])?;
counter += 8;
let mut members = IndexMap::with_capacity(num_members as usize);
for _ in 0..num_members {
let identifier_size = u8::from_bits_be(&bits_be[counter..counter + 8])?;
counter += 8;
let identifier = Identifier::from_bits_be(&bits_be[counter..counter + identifier_size as usize])?;
counter += identifier_size as usize;
let member_size = u16::from_bits_be(&bits_be[counter..counter + 16])?;
counter += 16;
let value = Plaintext::from_bits_be(&bits_be[counter..counter + member_size as usize])?;
counter += member_size as usize;
if members.insert(identifier, value).is_some() {
bail!("Duplicate identifier in struct.");
}
}
let cache = OnceCell::new();
match cache.set(bits_be.to_vec()) {
Ok(_) => Ok(Self::Struct(members, cache)),
Err(_) => bail!("Failed to store the plaintext bits in the cache."),
}
}
else {
bail!("Unknown plaintext variant.");
}
}
}