use super::*;
impl<A: Aleo> FromBits for Plaintext<A> {
type Boolean = Boolean<A>;
fn from_bits_le(bits_le: &[Boolean<A>]) -> Self {
let mut counter = 0;
let variant = [bits_le[counter].eject_value(), bits_le[counter + 1].eject_value()];
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]).eject_value();
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(_) => Self::Literal(literal, cache),
Err(_) => A::halt("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]).eject_value();
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]).eject_value();
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]).eject_value();
counter += 16;
let value = Plaintext::from_bits_le(&bits_le[counter..counter + *member_size as usize]);
counter += *member_size as usize;
members.insert(identifier, value);
}
let cache = OnceCell::new();
match cache.set(bits_le.to_vec()) {
Ok(_) => Self::Struct(members, cache),
Err(_) => A::halt("Failed to store the plaintext bits in the cache."),
}
}
else {
A::halt("Unknown plaintext variant.")
}
}
fn from_bits_be(bits_be: &[Boolean<A>]) -> Self {
let mut counter = 0;
let variant = [bits_be[counter].eject_value(), bits_be[counter + 1].eject_value()];
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]).eject_value();
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(_) => Self::Literal(literal, cache),
Err(_) => A::halt("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]).eject_value();
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]).eject_value();
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]).eject_value();
counter += 16;
let value = Plaintext::from_bits_be(&bits_be[counter..counter + *member_size as usize]);
counter += *member_size as usize;
members.insert(identifier, value);
}
let cache = OnceCell::new();
match cache.set(bits_be.to_vec()) {
Ok(_) => Self::Struct(members, cache),
Err(_) => A::halt("Failed to store the plaintext bits in the cache."),
}
}
else {
A::halt("Unknown plaintext variant.")
}
}
}