snarkvm_synthesizer_program/logic/finalize_operation/
bytes.rs

1// Copyright (c) 2019-2025 Provable Inc.
2// This file is part of the snarkVM library.
3
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at:
7
8// http://www.apache.org/licenses/LICENSE-2.0
9
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16use super::*;
17
18impl<N: Network> FromBytes for FinalizeOperation<N> {
19    /// Reads the finalize operation from buffer.
20    fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
21        // Read the variant.
22        let variant = u8::read_le(&mut reader)?;
23        // Read the finalize operation.
24        match variant {
25            0 => {
26                // Read the mapping ID.
27                let mapping_id = Field::read_le(&mut reader)?;
28                // Return the finalize operation.
29                Ok(Self::InitializeMapping(mapping_id))
30            }
31            1 => {
32                // Read the mapping ID.
33                let mapping_id = Field::read_le(&mut reader)?;
34                // Read the key ID.
35                let key_id = Field::read_le(&mut reader)?;
36                // Read the value ID.
37                let value_id = Field::read_le(&mut reader)?;
38                // Return the finalize operation.
39                Ok(Self::InsertKeyValue(mapping_id, key_id, value_id))
40            }
41            2 => {
42                // Read the mapping ID.
43                let mapping_id = Field::read_le(&mut reader)?;
44                // Read the key ID.
45                let key_id = Field::read_le(&mut reader)?;
46                // Read the value ID.
47                let value_id = Field::read_le(&mut reader)?;
48                // Return the finalize operation.
49                Ok(Self::UpdateKeyValue(mapping_id, key_id, value_id))
50            }
51            3 => {
52                // Read the mapping ID.
53                let mapping_id = Field::read_le(&mut reader)?;
54                // Read the key ID.
55                let key_id = Field::read_le(&mut reader)?;
56                // Return the finalize operation.
57                Ok(Self::RemoveKeyValue(mapping_id, key_id))
58            }
59            4 => {
60                // Read the mapping ID.
61                let mapping_id = Field::read_le(&mut reader)?;
62                // Return the finalize operation.
63                Ok(Self::ReplaceMapping(mapping_id))
64            }
65            5 => {
66                // Read the mapping ID.
67                let mapping_id = Field::read_le(&mut reader)?;
68                // Return the finalize operation.
69                Ok(Self::RemoveMapping(mapping_id))
70            }
71            6.. => Err(error(format!("Failed to decode finalize operation variant {variant}"))),
72        }
73    }
74}
75
76impl<N: Network> ToBytes for FinalizeOperation<N> {
77    /// Writes the finalize operation to buffer.
78    fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
79        match self {
80            Self::InitializeMapping(mapping_id) => {
81                // Write the variant.
82                0u8.write_le(&mut writer)?;
83                // Write the mapping ID.
84                mapping_id.write_le(&mut writer)?;
85            }
86            Self::InsertKeyValue(mapping_id, key_id, value_id) => {
87                // Write the variant.
88                1u8.write_le(&mut writer)?;
89                // Write the mapping ID.
90                mapping_id.write_le(&mut writer)?;
91                // Write the key ID.
92                key_id.write_le(&mut writer)?;
93                // Write the value ID.
94                value_id.write_le(&mut writer)?;
95            }
96            Self::UpdateKeyValue(mapping_id, key_id, value_id) => {
97                // Write the variant.
98                2u8.write_le(&mut writer)?;
99                // Write the mapping ID.
100                mapping_id.write_le(&mut writer)?;
101                // Write the key ID.
102                key_id.write_le(&mut writer)?;
103                // Write the value ID.
104                value_id.write_le(&mut writer)?;
105            }
106            Self::RemoveKeyValue(mapping_id, key_id) => {
107                // Write the variant.
108                3u8.write_le(&mut writer)?;
109                // Write the mapping ID.
110                mapping_id.write_le(&mut writer)?;
111                // Write the key ID.
112                key_id.write_le(&mut writer)?;
113            }
114            Self::ReplaceMapping(mapping_id) => {
115                // Write the variant.
116                4u8.write_le(&mut writer)?;
117                // Write the mapping ID.
118                mapping_id.write_le(&mut writer)?;
119            }
120            Self::RemoveMapping(mapping_id) => {
121                // Write the variant.
122                5u8.write_le(&mut writer)?;
123                // Write the mapping ID.
124                mapping_id.write_le(&mut writer)?;
125            }
126        }
127        Ok(())
128    }
129}
130
131#[cfg(test)]
132mod tests {
133    use super::*;
134
135    #[test]
136    fn test_bytes() {
137        for expected in crate::logic::finalize_operation::test_helpers::sample_finalize_operations() {
138            // Check the byte representation.
139            let expected_bytes = expected.to_bytes_le().unwrap();
140            assert_eq!(expected, FinalizeOperation::read_le(&expected_bytes[..]).unwrap());
141        }
142    }
143}