cardano_serialization_lib/serialization/
fixed_tx.rs1use crate::serialization::utils::deserilized_with_orig_bytes;
2use crate::*;
3
4impl cbor_event::se::Serialize for FixedTransaction {
5 fn serialize<'se, W: Write>(
6 &self,
7 serializer: &'se mut Serializer<W>,
8 ) -> cbor_event::Result<&'se mut Serializer<W>> {
9 serializer.write_array(cbor_event::Len::Len(4))?;
10 serializer.write_raw_bytes(&self.body_bytes_ref())?;
11 self.witnesses_set_ref().serialize(serializer)?;
12 serializer.write_special(CBORSpecial::Bool(self.is_valid()))?;
13 match &self.auxiliary_bytes_ref() {
14 Some(auxiliary_bytes) => serializer.write_raw_bytes(auxiliary_bytes)?,
15 None => serializer.write_special(CBORSpecial::Null)?,
16 };
17 Ok(serializer)
18 }
19}
20
21impl Deserialize for FixedTransaction {
22 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
23 (|| -> Result<_, DeserializeError> {
24 let len = raw.array()?;
25 let ret = Self::deserialize_as_embedded_group(raw, len);
26 match len {
27 cbor_event::Len::Len(_) =>
28 {
30 ()
31 }
32 cbor_event::Len::Indefinite => match raw.special()? {
33 CBORSpecial::Break =>
34 {
36 ()
37 }
38 _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
39 },
40 }
41 ret
42 })()
43 .map_err(|e| e.annotate("Transaction"))
44 }
45}
46
47impl DeserializeEmbeddedGroup for FixedTransaction {
48 fn deserialize_as_embedded_group<R: BufRead + Seek>(
49 raw: &mut Deserializer<R>,
50 _: cbor_event::Len,
51 ) -> Result<Self, DeserializeError> {
52 let (body, body_bytes) =
53 deserilized_with_orig_bytes(raw, |raw| TransactionBody::deserialize(raw))
54 .map_err(|e| e.annotate("body"))?;
55 let witness_set =
56 FixedTxWitnessesSet::deserialize(raw).map_err(|e| e.annotate("witness_set"))?;
57 let mut checked_auxiliary_data = false;
58 let mut auxiliary_data = None;
59 let mut auxiliary_bytes = None;
60 let is_valid = (|| -> Result<_, DeserializeError> {
61 match raw.cbor_type()? == CBORType::Special {
62 true => {
63 let special = raw.special()?;
65 if let CBORSpecial::Bool(b) = special {
66 return Ok(b);
67 } else if special == CBORSpecial::Null {
68 checked_auxiliary_data = true;
69 return Ok(true);
70 } else {
71 return Err(DeserializeFailure::ExpectedBool.into());
72 }
73 }
74 false => {
75 let (auxiliary_data_deser, auxiliary_bytes_deser) =
76 deserilized_with_orig_bytes(raw, |raw| AuxiliaryData::deserialize(raw))
77 .map_err(|e| e.annotate("auxiliary_data"))?;
78 auxiliary_data = Some(auxiliary_data_deser);
79 auxiliary_bytes = Some(auxiliary_bytes_deser);
80 checked_auxiliary_data = true;
82 return Ok(true);
83 }
84 }
85 })()
86 .map_err(|e| e.annotate("is_valid"))?;
87 if !checked_auxiliary_data {
88 (auxiliary_data, auxiliary_bytes) = (|| -> Result<_, DeserializeError> {
90 Ok(match raw.cbor_type()? != CBORType::Special {
91 true => {
92 let (auxiliary_data_deser, auxiliary_bytes_deser) =
93 deserilized_with_orig_bytes(raw, |raw| {
94 AuxiliaryData::deserialize(raw)
95 })?;
96 (Some(auxiliary_data_deser), Some(auxiliary_bytes_deser))
97 }
98 false => {
99 if raw.special()? != CBORSpecial::Null {
100 return Err(DeserializeFailure::ExpectedNull.into());
101 }
102 (None, None)
103 }
104 })
105 })()
106 .map_err(|e| e.annotate("auxiliary_data"))?;
107 }
108 FixedTransaction::new_with_original_bytes(
109 body,
110 body_bytes,
111 witness_set,
112 is_valid,
113 auxiliary_data,
114 auxiliary_bytes,
115 )
116 .map_err(|_| {
117 DeserializeError::new(
118 "FixedTransaction",
119 DeserializeFailure::CustomError("Failed to create FixedTransaction. \
120 Smth wrong with FixedTransaction::new_with_original_bytes()".to_string()),
121 )
122 })
123 }
124}