snarkvm_circuit_program/data/plaintext/
from_bits.rs1use super::*;
17
18impl<A: Aleo> FromBits for Plaintext<A> {
19 type Boolean = Boolean<A>;
20
21 fn from_bits_le(bits_le: &[Boolean<A>]) -> Self {
23 let bits = bits_le;
24
25 let mut index = 0;
27
28 let mut next_bits = |n: usize| -> &[Boolean<A>] {
30 let subslice = bits.get(index..index + n);
32 if let Some(next_bits) = subslice {
34 index += n;
36 next_bits
38 } else {
39 A::halt("Insufficient bits.")
40 }
41 };
42
43 let mut variant = next_bits(2).iter().map(|b| b.eject_value());
44 let variant1 = variant.next().unwrap();
45 let variant2 = variant.next().unwrap();
46 let variant = [variant1, variant2];
47
48 if variant == [false, false] {
50 let literal_variant = U8::from_bits_le(next_bits(8));
51 let literal_size = U16::from_bits_le(next_bits(16)).eject_value();
52 let literal = Literal::from_bits_le(&literal_variant, next_bits(*literal_size as usize));
53
54 Self::Literal(literal, OnceCell::with_value(bits_le.to_vec()))
56 }
57 else if variant == [false, true] {
59 let num_members = U8::from_bits_le(next_bits(8)).eject_value();
60
61 let mut members = IndexMap::with_capacity(*num_members as usize);
62 for _ in 0..*num_members {
63 let identifier_size = U8::from_bits_le(next_bits(8)).eject_value();
64 let identifier = Identifier::from_bits_le(next_bits(*identifier_size as usize));
65
66 let member_size = U16::from_bits_le(next_bits(16)).eject_value();
67 let value = Plaintext::from_bits_le(next_bits(*member_size as usize));
68
69 members.insert(identifier, value);
70 }
71
72 Self::Struct(members, OnceCell::with_value(bits_le.to_vec()))
74 }
75 else if variant == [true, false] {
77 let num_elements = U32::from_bits_le(next_bits(32)).eject_value();
78
79 let mut elements = Vec::with_capacity(*num_elements as usize);
80 for _ in 0..*num_elements {
81 let element_size = U16::from_bits_le(next_bits(16)).eject_value();
82 let value = Plaintext::from_bits_le(next_bits(*element_size as usize));
83
84 elements.push(value);
85 }
86
87 Self::Array(elements, OnceCell::with_value(bits_le.to_vec()))
89 }
90 else {
92 A::halt("Unknown plaintext variant.")
93 }
94 }
95
96 fn from_bits_be(bits_be: &[Boolean<A>]) -> Self {
98 let bits = bits_be;
99
100 let mut index = 0;
102
103 let mut next_bits = |n: usize| -> &[Boolean<A>] {
105 let subslice = bits.get(index..index + n);
107 if let Some(next_bits) = subslice {
109 index += n;
111 next_bits
113 } else {
114 A::halt("Insufficient bits.")
115 }
116 };
117
118 let mut variant = next_bits(2).iter().map(|b| b.eject_value());
119 let variant1 = variant.next().unwrap();
120 let variant2 = variant.next().unwrap();
121 let variant = [variant1, variant2];
122
123 if variant == [false, false] {
125 let literal_variant = U8::from_bits_be(next_bits(8));
126 let literal_size = U16::from_bits_be(next_bits(16)).eject_value();
127 let literal = Literal::from_bits_be(&literal_variant, next_bits(*literal_size as usize));
128
129 Self::Literal(literal, OnceCell::with_value(bits_be.to_vec()))
131 }
132 else if variant == [false, true] {
134 let num_members = U8::from_bits_be(next_bits(8)).eject_value();
135
136 let mut members = IndexMap::with_capacity(*num_members as usize);
137 for _ in 0..*num_members {
138 let identifier_size = U8::from_bits_be(next_bits(8)).eject_value();
139 let identifier = Identifier::from_bits_be(next_bits(*identifier_size as usize));
140
141 let member_size = U16::from_bits_be(next_bits(16)).eject_value();
142 let value = Plaintext::from_bits_be(next_bits(*member_size as usize));
143
144 members.insert(identifier, value);
145 }
146
147 Self::Struct(members, OnceCell::with_value(bits_be.to_vec()))
149 }
150 else if variant == [true, false] {
152 let num_elements = U32::from_bits_be(next_bits(32)).eject_value();
153
154 let mut elements = Vec::with_capacity(*num_elements as usize);
155 for _ in 0..*num_elements {
156 let element_size = U16::from_bits_be(next_bits(16)).eject_value();
157 let value = Plaintext::from_bits_be(next_bits(*element_size as usize));
158
159 elements.push(value);
160 }
161
162 Self::Array(elements, OnceCell::with_value(bits_be.to_vec()))
164 }
165 else {
167 A::halt("Unknown plaintext variant.")
168 }
169 }
170}