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.. => return Err(error(format!("Failed to decode literal variant {index}"))),
41 };
42 Ok(literal)
43 }
44}
45
46impl<N: Network> ToBytes for Literal<N> {
47 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
49 type Size = u16;
50 match self {
51 Self::Address(primitive) => {
52 (0 as Size).write_le(&mut writer)?;
53 primitive.write_le(&mut writer)
54 }
55 Self::Boolean(primitive) => {
56 (1 as Size).write_le(&mut writer)?;
57 primitive.write_le(&mut writer)
58 }
59 Self::Field(primitive) => {
60 (2 as Size).write_le(&mut writer)?;
61 primitive.write_le(&mut writer)
62 }
63 Self::Group(primitive) => {
64 (3 as Size).write_le(&mut writer)?;
65 primitive.write_le(&mut writer)
66 }
67 Self::I8(primitive) => {
68 (4 as Size).write_le(&mut writer)?;
69 primitive.write_le(&mut writer)
70 }
71 Self::I16(primitive) => {
72 (5 as Size).write_le(&mut writer)?;
73 primitive.write_le(&mut writer)
74 }
75 Self::I32(primitive) => {
76 (6 as Size).write_le(&mut writer)?;
77 primitive.write_le(&mut writer)
78 }
79 Self::I64(primitive) => {
80 (7 as Size).write_le(&mut writer)?;
81 primitive.write_le(&mut writer)
82 }
83 Self::I128(primitive) => {
84 (8 as Size).write_le(&mut writer)?;
85 primitive.write_le(&mut writer)
86 }
87 Self::U8(primitive) => {
88 (9 as Size).write_le(&mut writer)?;
89 primitive.write_le(&mut writer)
90 }
91 Self::U16(primitive) => {
92 (10 as Size).write_le(&mut writer)?;
93 primitive.write_le(&mut writer)
94 }
95 Self::U32(primitive) => {
96 (11 as Size).write_le(&mut writer)?;
97 primitive.write_le(&mut writer)
98 }
99 Self::U64(primitive) => {
100 (12 as Size).write_le(&mut writer)?;
101 primitive.write_le(&mut writer)
102 }
103 Self::U128(primitive) => {
104 (13 as Size).write_le(&mut writer)?;
105 primitive.write_le(&mut writer)
106 }
107 Self::Scalar(primitive) => {
108 (14 as Size).write_le(&mut writer)?;
109 primitive.write_le(&mut writer)
110 }
111 Self::Signature(primitive) => {
112 (15 as Size).write_le(&mut writer)?;
113 primitive.write_le(&mut writer)
114 }
115 Self::String(primitive) => {
116 (16 as Size).write_le(&mut writer)?;
117 primitive.write_le(&mut writer)
118 }
119 }
120 }
121}
122
123#[cfg(test)]
124mod tests {
125 use super::*;
126 use snarkvm_console_network::MainnetV0;
127
128 type CurrentNetwork = MainnetV0;
129
130 const ITERATIONS: u32 = 1000;
131
132 fn check_bytes(expected: Literal<CurrentNetwork>) -> Result<()> {
133 let expected_bytes = expected.to_bytes_le()?;
135 assert_eq!(expected, Literal::read_le(&expected_bytes[..])?);
136 Ok(())
137 }
138
139 #[test]
140 fn test_bytes() -> Result<()> {
141 let rng = &mut TestRng::default();
142
143 for _ in 0..ITERATIONS {
144 let private_key = snarkvm_console_account::PrivateKey::<CurrentNetwork>::new(rng)?;
145
146 check_bytes(Literal::<CurrentNetwork>::Address(Address::try_from(private_key)?))?;
148 check_bytes(Literal::<CurrentNetwork>::Boolean(Boolean::new(Uniform::rand(rng))))?;
150 check_bytes(Literal::<CurrentNetwork>::Field(Uniform::rand(rng)))?;
152 check_bytes(Literal::<CurrentNetwork>::Group(Uniform::rand(rng)))?;
154 check_bytes(Literal::<CurrentNetwork>::I8(I8::new(Uniform::rand(rng))))?;
156 check_bytes(Literal::<CurrentNetwork>::I16(I16::new(Uniform::rand(rng))))?;
158 check_bytes(Literal::<CurrentNetwork>::I32(I32::new(Uniform::rand(rng))))?;
160 check_bytes(Literal::<CurrentNetwork>::I64(I64::new(Uniform::rand(rng))))?;
162 check_bytes(Literal::<CurrentNetwork>::I128(I128::new(Uniform::rand(rng))))?;
164 check_bytes(Literal::<CurrentNetwork>::U8(U8::new(Uniform::rand(rng))))?;
166 check_bytes(Literal::<CurrentNetwork>::U16(U16::new(Uniform::rand(rng))))?;
168 check_bytes(Literal::<CurrentNetwork>::U32(U32::new(Uniform::rand(rng))))?;
170 check_bytes(Literal::<CurrentNetwork>::U64(U64::new(Uniform::rand(rng))))?;
172 check_bytes(Literal::<CurrentNetwork>::U128(U128::new(Uniform::rand(rng))))?;
174 check_bytes(Literal::<CurrentNetwork>::Scalar(Uniform::rand(rng)))?;
176 check_bytes(Literal::sample(LiteralType::Signature, rng))?;
178 check_bytes(Literal::<CurrentNetwork>::String(StringType::rand(rng)))?;
180 }
181 Ok(())
182 }
183}