cardano_serialization_lib/serialization/plutus/
redeemers.rs1use crate::*;
2use crate::serialization::utils::is_break_tag;
3
4impl Serialize for Redeemers {
5 fn serialize<'se, W: Write>(
6 &self,
7 serializer: &'se mut Serializer<W>,
8 ) -> cbor_event::Result<&'se mut Serializer<W>> {
9 match self.get_container_type() {
10 CborContainerType::Map => {
11 serializer.write_map(Len::Len(self.redeemers.len() as u64))?;
12 for element in &self.redeemers {
13 element.serialize_as_map_item(serializer)?;
14 }
15 }
16 CborContainerType::Array => {
17 serializer.write_array(Len::Len(self.redeemers.len() as u64))?;
18 for element in &self.redeemers {
19 element.serialize_as_array_item(serializer)?;
20 }
21 }
22 }
23 Ok(serializer)
24 }
25}
26
27impl Deserialize for Redeemers {
28 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
29 (|| -> Result<Self, DeserializeError> {
30 let cbor_type = raw.cbor_type()?;
31 match cbor_type {
32 cbor_event::Type::Array => Self::deserialize_as_array(raw),
33 cbor_event::Type::Map => Self::deserialize_as_map(raw),
34 _ => return Err(DeserializeFailure::ExpectedType("Array or Map".to_string(), cbor_type).into()),
35 }
36 })().map_err(|e| e.annotate("Redeemers"))
37 }
38}
39
40impl Redeemers {
41 fn deserialize_as_map<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
42 let mut arr = Vec::new();
43 let len = raw.map()?;
44 while match len {
45 Len::Len(n) => arr.len() < n as usize,
46 Len::Indefinite => true,
47 } {
48 if is_break_tag(raw, "Redeemers")? {
49 break;
50 }
51 arr.push(Redeemer::deserialize_as_map_item(raw)?);
52 }
53 Ok(Self {
54 redeemers: arr,
55 serialization_format: Some(CborContainerType::Map),
56 })
57 }
58
59 fn deserialize_as_array<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
60 let mut arr = Vec::new();
61 let len = raw.array()?;
62 while match len {
63 Len::Len(n) => arr.len() < n as usize,
64 Len::Indefinite => true,
65 } {
66 if is_break_tag(raw, "Redeemers")? {
67 break;
68 }
69 arr.push(Redeemer::deserialize_as_array_item(raw)?);
70 }
71 Ok(Self {
72 redeemers: arr,
73 serialization_format: Some(CborContainerType::Array),
74 })
75 }
76}