use super::*;
impl<A: Aleo> FromBits for Plaintext<A> {
type Boolean = Boolean<A>;
fn from_bits_le(bits_le: &[Boolean<A>]) -> Self {
let bits = bits_le;
let mut index = 0;
let mut next_bits = |n: usize| -> &[Boolean<A>] {
let subslice = bits.get(index..index + n);
if let Some(next_bits) = subslice {
index += n;
next_bits
} else {
A::halt("Insufficient bits.")
}
};
let mut variant = next_bits(2).iter().map(|b| b.eject_value());
let variant1 = variant.next().unwrap();
let variant2 = variant.next().unwrap();
let variant = [variant1, variant2];
if variant == [false, false] {
let literal_variant = U8::from_bits_le(next_bits(8));
let literal_size = U16::from_bits_le(next_bits(16)).eject_value();
let literal = Literal::from_bits_le(&literal_variant, next_bits(*literal_size as usize));
Self::Literal(literal, OnceCell::with_value(bits_le.to_vec()))
}
else if variant == [false, true] {
let num_members = U8::from_bits_le(next_bits(8)).eject_value();
let mut members = IndexMap::with_capacity(*num_members as usize);
for _ in 0..*num_members {
let identifier_size = U8::from_bits_le(next_bits(8)).eject_value();
let identifier = Identifier::from_bits_le(next_bits(*identifier_size as usize));
let member_size = U16::from_bits_le(next_bits(16)).eject_value();
let value = Plaintext::from_bits_le(next_bits(*member_size as usize));
members.insert(identifier, value);
}
Self::Struct(members, OnceCell::with_value(bits_le.to_vec()))
}
else if variant == [true, false] {
let num_elements = U32::from_bits_le(next_bits(32)).eject_value();
let mut elements = Vec::with_capacity(*num_elements as usize);
for _ in 0..*num_elements {
let element_size = U16::from_bits_le(next_bits(16)).eject_value();
let value = Plaintext::from_bits_le(next_bits(*element_size as usize));
elements.push(value);
}
Self::Array(elements, OnceCell::with_value(bits_le.to_vec()))
}
else {
A::halt("Unknown plaintext variant.")
}
}
fn from_bits_be(bits_be: &[Boolean<A>]) -> Self {
let bits = bits_be;
let mut index = 0;
let mut next_bits = |n: usize| -> &[Boolean<A>] {
let subslice = bits.get(index..index + n);
if let Some(next_bits) = subslice {
index += n;
next_bits
} else {
A::halt("Insufficient bits.")
}
};
let mut variant = next_bits(2).iter().map(|b| b.eject_value());
let variant1 = variant.next().unwrap();
let variant2 = variant.next().unwrap();
let variant = [variant1, variant2];
if variant == [false, false] {
let literal_variant = U8::from_bits_be(next_bits(8));
let literal_size = U16::from_bits_be(next_bits(16)).eject_value();
let literal = Literal::from_bits_be(&literal_variant, next_bits(*literal_size as usize));
Self::Literal(literal, OnceCell::with_value(bits_be.to_vec()))
}
else if variant == [false, true] {
let num_members = U8::from_bits_be(next_bits(8)).eject_value();
let mut members = IndexMap::with_capacity(*num_members as usize);
for _ in 0..*num_members {
let identifier_size = U8::from_bits_be(next_bits(8)).eject_value();
let identifier = Identifier::from_bits_be(next_bits(*identifier_size as usize));
let member_size = U16::from_bits_be(next_bits(16)).eject_value();
let value = Plaintext::from_bits_be(next_bits(*member_size as usize));
members.insert(identifier, value);
}
Self::Struct(members, OnceCell::with_value(bits_be.to_vec()))
}
else if variant == [true, false] {
let num_elements = U32::from_bits_be(next_bits(32)).eject_value();
let mut elements = Vec::with_capacity(*num_elements as usize);
for _ in 0..*num_elements {
let element_size = U16::from_bits_be(next_bits(16)).eject_value();
let value = Plaintext::from_bits_be(next_bits(*element_size as usize));
elements.push(value);
}
Self::Array(elements, OnceCell::with_value(bits_be.to_vec()))
}
else {
A::halt("Unknown plaintext variant.")
}
}
}