snarkvm_ledger_block/transaction/deployment/
serialize.rs1use super::*;
17
18impl<N: Network> Serialize for Deployment<N> {
19 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
21 match serializer.is_human_readable() {
22 true => {
23 let len = match self.version().map_err(ser::Error::custom)? {
28 DeploymentVersion::V1 => 3,
29 DeploymentVersion::V2 => 5,
30 DeploymentVersion::V3 => 4,
31 };
32 let mut deployment = serializer.serialize_struct("Deployment", len)?;
33 deployment.serialize_field("edition", &self.edition)?;
34 deployment.serialize_field("program", &self.program)?;
35 deployment.serialize_field("verifying_keys", &self.verifying_keys)?;
36 if let Some(program_checksum) = &self.program_checksum {
37 deployment.serialize_field("program_checksum", program_checksum)?;
38 }
39 if let Some(program_owner) = &self.program_owner {
40 deployment.serialize_field("program_owner", program_owner)?;
41 }
42 deployment.end()
43 }
44 false => ToBytesSerializer::serialize_with_size_encoding(self, serializer),
45 }
46 }
47}
48
49impl<'de, N: Network> Deserialize<'de> for Deployment<N> {
50 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
52 match deserializer.is_human_readable() {
53 true => {
54 let mut deployment = serde_json::Value::deserialize(deserializer)?;
56
57 let deployment = Self::new(
59 DeserializeExt::take_from_value::<D>(&mut deployment, "edition")?,
61 DeserializeExt::take_from_value::<D>(&mut deployment, "program")?,
63 DeserializeExt::take_from_value::<D>(&mut deployment, "verifying_keys")?,
65 serde_json::from_value(
67 deployment.get_mut("program_checksum").unwrap_or(&mut serde_json::Value::Null).take(),
68 )
69 .map_err(de::Error::custom)?,
70 serde_json::from_value(
72 deployment.get_mut("program_owner").unwrap_or(&mut serde_json::Value::Null).take(),
73 )
74 .map_err(de::Error::custom)?,
75 )
76 .map_err(de::Error::custom)?;
77
78 Ok(deployment)
79 }
80 false => FromBytesDeserializer::<Self>::deserialize_with_size_encoding(deserializer, "deployment"),
81 }
82 }
83}
84
85#[cfg(test)]
86mod tests {
87 use super::*;
88
89 #[test]
90 fn test_serde_json() -> Result<()> {
91 let rng = &mut TestRng::default();
92
93 for expected in [
95 test_helpers::sample_deployment_v1(Uniform::rand(rng), rng),
96 test_helpers::sample_deployment_v2_without_translation_keys(Uniform::rand(rng), rng),
97 test_helpers::sample_deployment_v2_with_translation_keys(Uniform::rand(rng), rng),
98 test_helpers::sample_deployment_v3(Uniform::rand(rng), rng),
99 ] {
100 let expected_string = &expected.to_string();
102 let candidate_string = serde_json::to_string(&expected)?;
103 assert_eq!(expected, serde_json::from_str(&candidate_string)?);
104
105 assert_eq!(expected, Deployment::from_str(expected_string)?);
107 assert_eq!(expected, serde_json::from_str(&candidate_string)?);
108 }
109
110 Ok(())
111 }
112
113 #[test]
114 fn test_bincode() -> Result<()> {
115 let rng = &mut TestRng::default();
116
117 for expected in [
119 test_helpers::sample_deployment_v1(Uniform::rand(rng), rng),
120 test_helpers::sample_deployment_v2_without_translation_keys(Uniform::rand(rng), rng),
121 test_helpers::sample_deployment_v2_with_translation_keys(Uniform::rand(rng), rng),
122 test_helpers::sample_deployment_v3(Uniform::rand(rng), rng),
123 ] {
124 let expected_bytes = expected.to_bytes_le()?;
126 let expected_bytes_with_size_encoding = bincode::serialize(&expected)?;
127 assert_eq!(&expected_bytes[..], &expected_bytes_with_size_encoding[8..]);
128
129 assert_eq!(expected, Deployment::read_le(&expected_bytes[..])?);
131 assert_eq!(expected, bincode::deserialize(&expected_bytes_with_size_encoding[..])?);
132 }
133
134 Ok(())
135 }
136}