snarkvm_console_program/data/literal/
bytes.rs1use super::*;
17
18impl<N: Network> FromBytes for Literal<N> {
19 fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
21 let index = u16::read_le(&mut reader)?;
22 let literal = match index {
23 0 => Self::Address(Address::read_le(&mut reader)?),
24 1 => Self::Boolean(Boolean::read_le(&mut reader)?),
25 2 => Self::Field(Field::read_le(&mut reader)?),
26 3 => Self::Group(Group::read_le(&mut reader)?),
27 4 => Self::I8(I8::read_le(&mut reader)?),
28 5 => Self::I16(I16::read_le(&mut reader)?),
29 6 => Self::I32(I32::read_le(&mut reader)?),
30 7 => Self::I64(I64::read_le(&mut reader)?),
31 8 => Self::I128(I128::read_le(&mut reader)?),
32 9 => Self::U8(U8::read_le(&mut reader)?),
33 10 => Self::U16(U16::read_le(&mut reader)?),
34 11 => Self::U32(U32::read_le(&mut reader)?),
35 12 => Self::U64(U64::read_le(&mut reader)?),
36 13 => Self::U128(U128::read_le(&mut reader)?),
37 14 => Self::Scalar(Scalar::read_le(&mut reader)?),
38 15 => Self::Signature(Box::new(Signature::read_le(&mut reader)?)),
39 16 => Self::String(StringType::read_le(&mut reader)?),
40 17 => Self::Identifier(Box::new(IdentifierLiteral::read_le(&mut reader)?)),
41 18.. => return Err(error(format!("Failed to decode literal variant {index}"))),
42 };
43 Ok(literal)
44 }
45}
46
47impl<N: Network> ToBytes for Literal<N> {
48 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
50 type Size = u16;
51 match self {
52 Self::Address(primitive) => {
53 (0 as Size).write_le(&mut writer)?;
54 primitive.write_le(&mut writer)
55 }
56 Self::Boolean(primitive) => {
57 (1 as Size).write_le(&mut writer)?;
58 primitive.write_le(&mut writer)
59 }
60 Self::Field(primitive) => {
61 (2 as Size).write_le(&mut writer)?;
62 primitive.write_le(&mut writer)
63 }
64 Self::Group(primitive) => {
65 (3 as Size).write_le(&mut writer)?;
66 primitive.write_le(&mut writer)
67 }
68 Self::I8(primitive) => {
69 (4 as Size).write_le(&mut writer)?;
70 primitive.write_le(&mut writer)
71 }
72 Self::I16(primitive) => {
73 (5 as Size).write_le(&mut writer)?;
74 primitive.write_le(&mut writer)
75 }
76 Self::I32(primitive) => {
77 (6 as Size).write_le(&mut writer)?;
78 primitive.write_le(&mut writer)
79 }
80 Self::I64(primitive) => {
81 (7 as Size).write_le(&mut writer)?;
82 primitive.write_le(&mut writer)
83 }
84 Self::I128(primitive) => {
85 (8 as Size).write_le(&mut writer)?;
86 primitive.write_le(&mut writer)
87 }
88 Self::U8(primitive) => {
89 (9 as Size).write_le(&mut writer)?;
90 primitive.write_le(&mut writer)
91 }
92 Self::U16(primitive) => {
93 (10 as Size).write_le(&mut writer)?;
94 primitive.write_le(&mut writer)
95 }
96 Self::U32(primitive) => {
97 (11 as Size).write_le(&mut writer)?;
98 primitive.write_le(&mut writer)
99 }
100 Self::U64(primitive) => {
101 (12 as Size).write_le(&mut writer)?;
102 primitive.write_le(&mut writer)
103 }
104 Self::U128(primitive) => {
105 (13 as Size).write_le(&mut writer)?;
106 primitive.write_le(&mut writer)
107 }
108 Self::Scalar(primitive) => {
109 (14 as Size).write_le(&mut writer)?;
110 primitive.write_le(&mut writer)
111 }
112 Self::Signature(primitive) => {
113 (15 as Size).write_le(&mut writer)?;
114 primitive.write_le(&mut writer)
115 }
116 Self::String(primitive) => {
117 (16 as Size).write_le(&mut writer)?;
118 primitive.write_le(&mut writer)
119 }
120 Self::Identifier(primitive) => {
121 (17 as Size).write_le(&mut writer)?;
122 primitive.write_le(&mut writer)
123 }
124 }
125 }
126}
127
128#[cfg(test)]
129mod tests {
130 use super::*;
131 use snarkvm_console_network::MainnetV0;
132
133 type CurrentNetwork = MainnetV0;
134
135 const ITERATIONS: u32 = 1000;
136
137 fn check_bytes(expected: Literal<CurrentNetwork>) -> Result<()> {
138 let expected_bytes = expected.to_bytes_le()?;
140 assert_eq!(expected, Literal::read_le(&expected_bytes[..])?);
141 Ok(())
142 }
143
144 #[test]
145 fn test_bytes() -> Result<()> {
146 let rng = &mut TestRng::default();
147
148 for _ in 0..ITERATIONS {
149 let private_key = snarkvm_console_account::PrivateKey::<CurrentNetwork>::new(rng)?;
150
151 check_bytes(Literal::<CurrentNetwork>::Address(Address::try_from(private_key)?))?;
153 check_bytes(Literal::<CurrentNetwork>::Boolean(Boolean::new(Uniform::rand(rng))))?;
155 check_bytes(Literal::<CurrentNetwork>::Field(Uniform::rand(rng)))?;
157 check_bytes(Literal::<CurrentNetwork>::Group(Uniform::rand(rng)))?;
159 check_bytes(Literal::<CurrentNetwork>::I8(I8::new(Uniform::rand(rng))))?;
161 check_bytes(Literal::<CurrentNetwork>::I16(I16::new(Uniform::rand(rng))))?;
163 check_bytes(Literal::<CurrentNetwork>::I32(I32::new(Uniform::rand(rng))))?;
165 check_bytes(Literal::<CurrentNetwork>::I64(I64::new(Uniform::rand(rng))))?;
167 check_bytes(Literal::<CurrentNetwork>::I128(I128::new(Uniform::rand(rng))))?;
169 check_bytes(Literal::<CurrentNetwork>::U8(U8::new(Uniform::rand(rng))))?;
171 check_bytes(Literal::<CurrentNetwork>::U16(U16::new(Uniform::rand(rng))))?;
173 check_bytes(Literal::<CurrentNetwork>::U32(U32::new(Uniform::rand(rng))))?;
175 check_bytes(Literal::<CurrentNetwork>::U64(U64::new(Uniform::rand(rng))))?;
177 check_bytes(Literal::<CurrentNetwork>::U128(U128::new(Uniform::rand(rng))))?;
179 check_bytes(Literal::<CurrentNetwork>::Scalar(Uniform::rand(rng)))?;
181 check_bytes(Literal::sample(LiteralType::Signature, rng))?;
183 check_bytes(Literal::<CurrentNetwork>::String(StringType::rand(rng)))?;
185 check_bytes(Literal::<CurrentNetwork>::Identifier(Box::new(Uniform::rand(rng))))?;
187 }
188 Ok(())
189 }
190}