cardano_serialization_lib/serialization/plutus/
redeemers.rs

1use 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}