snarkvm_console_program/data/future/
bytes.rs1use super::*;
17
18impl<N: Network> FromBytes for Future<N> {
19 fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
21 let program_id = ProgramID::read_le(&mut reader)?;
23 let function_name = Identifier::<N>::read_le(&mut reader)?;
25 let num_arguments = u8::read_le(&mut reader)? as usize;
27 if num_arguments > N::MAX_INPUTS {
28 return Err(error("Failed to read future: too many arguments"));
29 };
30 let mut arguments = Vec::with_capacity(num_arguments);
32 for _ in 0..num_arguments {
33 let num_bytes = u16::read_le(&mut reader)?;
35 let mut bytes = Vec::new();
37 (&mut reader).take(num_bytes as u64).read_to_end(&mut bytes)?;
38 let entry = Argument::read_le(&mut bytes.as_slice())?;
40 arguments.push(entry);
42 }
43 Ok(Self::new(program_id, function_name, arguments))
45 }
46}
47
48impl<N: Network> ToBytes for Future<N> {
49 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
51 self.program_id.write_le(&mut writer)?;
53 self.function_name.write_le(&mut writer)?;
55 if self.arguments.len() > N::MAX_INPUTS {
57 return Err(error("Failed to write future: too many arguments"));
58 };
59 u8::try_from(self.arguments.len()).map_err(error)?.write_le(&mut writer)?;
60 for argument in &self.arguments {
62 let bytes = argument.to_bytes_le().map_err(error)?;
64 u16::try_from(bytes.len()).map_err(error)?.write_le(&mut writer)?;
66 bytes.write_le(&mut writer)?;
68 }
69 Ok(())
70 }
71}
72
73#[cfg(test)]
74mod tests {
75 use super::*;
76 use snarkvm_console_network::MainnetV0;
77
78 type CurrentNetwork = MainnetV0;
79
80 #[test]
81 fn test_bytes() -> Result<()> {
82 let expected =
84 Future::<CurrentNetwork>::from_str("{ program_id: credits.aleo, function_name: transfer, arguments: [] }")?;
85
86 let expected_bytes = expected.to_bytes_le()?;
88 assert_eq!(expected, Future::read_le(&expected_bytes[..])?);
89
90 Ok(())
91 }
92}