snarkvm_ledger_block/transactions/rejected/
serialize.rs1use super::*;
17
18impl<N: Network> Serialize for Rejected<N> {
19 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
21 match serializer.is_human_readable() {
22 true => match self {
23 Self::Deployment(program_owner, deployment) => {
24 let mut object = serializer.serialize_struct("Rejected", 3)?;
25 object.serialize_field("type", "deployment")?;
26 object.serialize_field("program_owner", program_owner)?;
27 object.serialize_field("deployment", deployment)?;
28 object.end()
29 }
30 Self::Execution(execution) => {
31 let mut object = serializer.serialize_struct("Rejected", 2)?;
32 object.serialize_field("type", "execution")?;
33 object.serialize_field("execution", execution)?;
34 object.end()
35 }
36 },
37 false => ToBytesSerializer::serialize_with_size_encoding(self, serializer),
38 }
39 }
40}
41
42impl<'de, N: Network> Deserialize<'de> for Rejected<N> {
43 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
45 match deserializer.is_human_readable() {
46 true => {
47 let mut object = serde_json::Value::deserialize(deserializer)?;
49
50 let type_ = object.get("type").and_then(|t| t.as_str());
52
53 match type_ {
55 Some("deployment") => {
56 let program_owner: ProgramOwner<N> =
58 DeserializeExt::take_from_value::<D>(&mut object, "program_owner")?;
59 let deployment: Deployment<N> =
61 DeserializeExt::take_from_value::<D>(&mut object, "deployment")?;
62 Ok(Self::new_deployment(program_owner, deployment))
64 }
65 Some("execution") => {
66 let execution: Execution<N> = DeserializeExt::take_from_value::<D>(&mut object, "execution")?;
68 Ok(Self::new_execution(execution))
70 }
71 _ => Err(de::Error::custom("Invalid rejected transaction type")),
72 }
73 }
74 false => {
75 FromBytesDeserializer::<Self>::deserialize_with_size_encoding(deserializer, "confirmed transaction")
76 }
77 }
78 }
79}
80
81#[cfg(test)]
82mod tests {
83 use super::*;
84
85 fn check_serde_json<
86 T: Serialize + for<'a> Deserialize<'a> + Debug + Display + PartialEq + Eq + FromStr + ToBytes + FromBytes,
87 >(
88 expected: T,
89 ) {
90 let expected_string = expected.to_string();
92 let candidate_string = serde_json::to_string(&expected).unwrap();
93 let candidate = serde_json::from_str::<T>(&candidate_string).unwrap();
94 assert_eq!(expected, candidate);
95 assert_eq!(expected_string, candidate_string);
96 assert_eq!(expected_string, candidate.to_string());
97
98 assert_eq!(expected, T::from_str(&expected_string).unwrap_or_else(|_| panic!("FromStr: {expected_string}")));
100 assert_eq!(expected, serde_json::from_str(&candidate_string).unwrap());
101 }
102
103 fn check_bincode<
104 T: Serialize + for<'a> Deserialize<'a> + Debug + Display + PartialEq + Eq + FromStr + ToBytes + FromBytes,
105 >(
106 expected: T,
107 ) {
108 let expected_bytes = expected.to_bytes_le().unwrap();
110 let expected_bytes_with_size_encoding = bincode::serialize(&expected).unwrap();
111 assert_eq!(&expected_bytes[..], &expected_bytes_with_size_encoding[8..]);
112
113 assert_eq!(expected, T::read_le(&expected_bytes[..]).unwrap());
115 assert_eq!(expected, bincode::deserialize(&expected_bytes_with_size_encoding[..]).unwrap());
116 }
117
118 #[test]
119 fn test_serde_json() {
120 for rejected in crate::transactions::rejected::test_helpers::sample_rejected_transactions() {
121 check_serde_json(rejected);
122 }
123 }
124
125 #[test]
126 fn test_bincode() {
127 for rejected in crate::transactions::rejected::test_helpers::sample_rejected_transactions() {
128 check_bincode(rejected);
129 }
130 }
131}