snarkvm_synthesizer_program/logic/instruction/operand/
bytes.rs1use super::*;
17
18impl<N: Network> FromBytes for Operand<N> {
19 fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
20 match u8::read_le(&mut reader)? {
21 0 => Ok(Self::Literal(Literal::read_le(&mut reader)?)),
22 1 => Ok(Self::Register(Register::read_le(&mut reader)?)),
23 2 => Ok(Self::ProgramID(ProgramID::read_le(&mut reader)?)),
24 3 => Ok(Self::Signer),
25 4 => Ok(Self::Caller),
26 5 => Ok(Self::BlockHeight),
27 6 => Ok(Self::NetworkID),
28 7 => {
29 let program_id = match u8::read_le(&mut reader)? {
31 0 => None,
32 1 => Some(ProgramID::read_le(&mut reader)?),
33 variant => return Err(error(format!("Invalid program ID variant '{variant}' for the checksum"))),
34 };
35 Ok(Self::Checksum(program_id))
36 }
37 8 => {
38 let program_id = match u8::read_le(&mut reader)? {
40 0 => None,
41 1 => Some(ProgramID::read_le(&mut reader)?),
42 variant => return Err(error(format!("Invalid program ID variant '{variant}' for the edition"))),
43 };
44 Ok(Self::Edition(program_id))
45 }
46 9 => {
47 let program_id = match u8::read_le(&mut reader)? {
49 0 => None,
50 1 => Some(ProgramID::read_le(&mut reader)?),
51 variant => return Err(error(format!("Invalid program ID variant '{variant}' for the owner"))),
52 };
53 Ok(Self::ProgramOwner(program_id))
54 }
55 10 => Ok(Self::BlockTimestamp),
56 variant => Err(error(format!("Failed to deserialize operand variant {variant}"))),
57 }
58 }
59}
60
61impl<N: Network> ToBytes for Operand<N> {
62 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
63 match self {
64 Self::Literal(literal) => {
65 0u8.write_le(&mut writer)?;
66 literal.write_le(&mut writer)
67 }
68 Self::Register(register) => {
69 1u8.write_le(&mut writer)?;
70 register.write_le(&mut writer)
71 }
72 Self::ProgramID(program_id) => {
73 2u8.write_le(&mut writer)?;
74 program_id.write_le(&mut writer)
75 }
76 Self::Signer => 3u8.write_le(&mut writer),
77 Self::Caller => 4u8.write_le(&mut writer),
78 Self::BlockHeight => 5u8.write_le(&mut writer),
79 Self::NetworkID => 6u8.write_le(&mut writer),
80 Self::Checksum(program_id) => {
81 7u8.write_le(&mut writer)?;
82 match program_id {
84 None => 0u8.write_le(&mut writer),
85 Some(program_id) => {
86 1u8.write_le(&mut writer)?;
87 program_id.write_le(&mut writer)
88 }
89 }
90 }
91 Self::Edition(program_id) => {
92 8u8.write_le(&mut writer)?;
93 match program_id {
95 None => 0u8.write_le(&mut writer),
96 Some(program_id) => {
97 1u8.write_le(&mut writer)?;
98 program_id.write_le(&mut writer)
99 }
100 }
101 }
102 Self::ProgramOwner(program_id) => {
103 9u8.write_le(&mut writer)?;
104 match program_id {
106 None => 0u8.write_le(&mut writer),
107 Some(program_id) => {
108 1u8.write_le(&mut writer)?;
109 program_id.write_le(&mut writer)
110 }
111 }
112 }
113 Self::BlockTimestamp => 10u8.write_le(&mut writer),
114 }
115 }
116}