snarkvm_synthesizer_program/logic/finalize_operation/
serialize.rs1use super::*;
17
18impl<N: Network> Serialize for FinalizeOperation<N> {
19 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
21 match serializer.is_human_readable() {
22 true => {
23 match self {
25 Self::InitializeMapping(mapping_id) => {
26 let mut operation = serializer.serialize_struct("FinalizeOperation", 2)?;
27 operation.serialize_field("type", "initialize_mapping")?;
28 operation.serialize_field("mapping_id", mapping_id)?;
29 operation.end()
30 }
31 Self::InsertKeyValue(mapping_id, key_id, value_id) => {
32 let mut operation = serializer.serialize_struct("FinalizeOperation", 4)?;
33 operation.serialize_field("type", "insert_key_value")?;
34 operation.serialize_field("mapping_id", mapping_id)?;
35 operation.serialize_field("key_id", key_id)?;
36 operation.serialize_field("value_id", value_id)?;
37 operation.end()
38 }
39 Self::UpdateKeyValue(mapping_id, key_id, value_id) => {
40 let mut operation = serializer.serialize_struct("FinalizeOperation", 4)?;
41 operation.serialize_field("type", "update_key_value")?;
42 operation.serialize_field("mapping_id", mapping_id)?;
43 operation.serialize_field("key_id", key_id)?;
44 operation.serialize_field("value_id", value_id)?;
45 operation.end()
46 }
47 Self::RemoveKeyValue(mapping_id, key_id) => {
48 let mut operation = serializer.serialize_struct("FinalizeOperation", 3)?;
49 operation.serialize_field("type", "remove_key_value")?;
50 operation.serialize_field("mapping_id", mapping_id)?;
51 operation.serialize_field("key_id", key_id)?;
52 operation.end()
53 }
54 Self::ReplaceMapping(mapping_id) => {
55 let mut operation = serializer.serialize_struct("FinalizeOperation", 2)?;
56 operation.serialize_field("type", "replace_mapping")?;
57 operation.serialize_field("mapping_id", mapping_id)?;
58 operation.end()
59 }
60 Self::RemoveMapping(mapping_id) => {
61 let mut operation = serializer.serialize_struct("FinalizeOperation", 2)?;
62 operation.serialize_field("type", "remove_mapping")?;
63 operation.serialize_field("mapping_id", mapping_id)?;
64 operation.end()
65 }
66 }
67 }
68 false => ToBytesSerializer::serialize_with_size_encoding(self, serializer),
69 }
70 }
71}
72
73impl<'de, N: Network> Deserialize<'de> for FinalizeOperation<N> {
74 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
76 match deserializer.is_human_readable() {
77 true => {
78 let mut operation = serde_json::Value::deserialize(deserializer)?;
79 let finalize_operation = match operation.get("type").and_then(|t| t.as_str()) {
81 Some("initialize_mapping") => {
82 let mapping_id = DeserializeExt::take_from_value::<D>(&mut operation, "mapping_id")?;
84 Self::InitializeMapping(mapping_id)
86 }
87 Some("insert_key_value") => {
88 let mapping_id = DeserializeExt::take_from_value::<D>(&mut operation, "mapping_id")?;
90 let key_id = DeserializeExt::take_from_value::<D>(&mut operation, "key_id")?;
92 let value_id = DeserializeExt::take_from_value::<D>(&mut operation, "value_id")?;
94 Self::InsertKeyValue(mapping_id, key_id, value_id)
96 }
97 Some("update_key_value") => {
98 let mapping_id = DeserializeExt::take_from_value::<D>(&mut operation, "mapping_id")?;
100 let key_id = DeserializeExt::take_from_value::<D>(&mut operation, "key_id")?;
102 let value_id = DeserializeExt::take_from_value::<D>(&mut operation, "value_id")?;
104 Self::UpdateKeyValue(mapping_id, key_id, value_id)
106 }
107 Some("remove_key_value") => {
108 let mapping_id = DeserializeExt::take_from_value::<D>(&mut operation, "mapping_id")?;
110 let key_id = DeserializeExt::take_from_value::<D>(&mut operation, "key_id")?;
112 Self::RemoveKeyValue(mapping_id, key_id)
114 }
115 Some("replace_mapping") => {
116 let mapping_id = DeserializeExt::take_from_value::<D>(&mut operation, "mapping_id")?;
118 Self::ReplaceMapping(mapping_id)
120 }
121 Some("remove_mapping") => {
122 let mapping_id = DeserializeExt::take_from_value::<D>(&mut operation, "mapping_id")?;
124 Self::RemoveMapping(mapping_id)
126 }
127 _ => return Err(de::Error::custom("Invalid finalize operation type")),
128 };
129 Ok(finalize_operation)
131 }
132 false => FromBytesDeserializer::<Self>::deserialize_with_size_encoding(deserializer, "finalize operations"),
133 }
134 }
135}
136
137#[cfg(test)]
138mod tests {
139 use super::*;
140
141 fn check_serde_json<
142 T: Serialize + for<'a> Deserialize<'a> + Debug + Display + PartialEq + Eq + FromStr + ToBytes + FromBytes,
143 >(
144 expected: T,
145 ) {
146 let expected_string = expected.to_string();
148 let candidate_string = serde_json::to_string(&expected).unwrap();
149 let candidate = serde_json::from_str::<T>(&candidate_string).unwrap();
150 assert_eq!(expected, candidate);
151 assert_eq!(expected_string, candidate_string);
152 assert_eq!(expected_string, candidate.to_string());
153
154 assert_eq!(expected, T::from_str(&expected_string).unwrap_or_else(|_| panic!("FromStr: {expected_string}")));
156 assert_eq!(expected, serde_json::from_str(&candidate_string).unwrap());
157 }
158
159 fn check_bincode<
160 T: Serialize + for<'a> Deserialize<'a> + Debug + Display + PartialEq + Eq + FromStr + ToBytes + FromBytes,
161 >(
162 expected: T,
163 ) {
164 let expected_bytes = expected.to_bytes_le().unwrap();
166 let expected_bytes_with_size_encoding = bincode::serialize(&expected).unwrap();
167 assert_eq!(&expected_bytes[..], &expected_bytes_with_size_encoding[8..]);
168
169 assert_eq!(expected, T::read_le(&expected_bytes[..]).unwrap());
171 assert_eq!(expected, bincode::deserialize(&expected_bytes_with_size_encoding[..]).unwrap());
172 }
173
174 #[test]
175 fn test_serde_json() {
176 for finalize in crate::logic::finalize_operation::test_helpers::sample_finalize_operations() {
177 check_serde_json(finalize);
178 }
179 }
180
181 #[test]
182 fn test_bincode() {
183 for finalize in crate::logic::finalize_operation::test_helpers::sample_finalize_operations() {
184 check_bincode(finalize);
185 }
186 }
187}