cardano_serialization_lib/serialization/plutus/
plutus_scripts.rs

1use crate::*;
2use crate::serialization::utils::{is_break_tag, skip_set_tag};
3
4impl cbor_event::se::Serialize for PlutusScripts {
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(self.len() as u64))?;
10        for element in self {
11            element.serialize(serializer)?;
12        }
13        Ok(serializer)
14    }
15}
16
17impl PlutusScripts {
18    pub(crate) fn serialize_by_version<'se, W: Write>(
19        &self,
20        version: &Language,
21        serializer: &'se mut Serializer<W>,
22    ) -> cbor_event::Result<&'se mut Serializer<W>> {
23        let view = self.view(version);
24        serializer.write_array(cbor_event::Len::Len(view.len() as u64))?;
25        for element in view {
26            element.serialize(serializer)?;
27        }
28        Ok(serializer)
29    }
30
31    pub(crate) fn serialize_as_set_by_version<'se, W: Write>(
32        &self,
33        need_deduplication: bool,
34        version: &Language,
35        serializer: &'se mut Serializer<W>,
36    ) -> cbor_event::Result<&'se mut Serializer<W>> {
37        serializer.write_tag(258)?;
38        let view = match need_deduplication {
39            true => self.deduplicated_view(Some(version)),
40            false => self.view(version),
41        };
42        serializer.write_array(cbor_event::Len::Len(view.len() as u64))?;
43        for element in view {
44            element.serialize(serializer)?;
45        }
46        Ok(serializer)
47    }
48
49}
50
51impl Deserialize for PlutusScripts {
52    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
53        let has_set_tag = skip_set_tag(raw)?;
54        let mut arr = Vec::new();
55        (|| -> Result<_, DeserializeError> {
56            let len = raw.array()?;
57            while match len {
58                cbor_event::Len::Len(n) => arr.len() < n as usize,
59                cbor_event::Len::Indefinite => true,
60            } {
61                if is_break_tag(raw, "PlutusScripts")? {
62                    break;
63                }
64                arr.push(PlutusScript::deserialize(raw)?);
65            }
66            Ok(())
67        })()
68            .map_err(|e| e.annotate("PlutusScripts"))?;
69
70        let set_tag = if has_set_tag {
71            Some(CborSetType::Tagged)
72        } else {
73            Some(CborSetType::Untagged)
74        };
75
76        Ok(Self::from_vec(arr, set_tag))
77    }
78}
79
80impl PlutusScripts {
81    pub(crate) fn deserialize_with_version<R: BufRead + Seek>(raw: &mut Deserializer<R>, version: &Language) -> Result<Self, DeserializeError> {
82        let mut arr = Vec::new();
83        let has_set_tag = skip_set_tag(raw)?;
84        (|| -> Result<_, DeserializeError> {
85            let len = raw.array()?;
86            while match len {
87                cbor_event::Len::Len(n) => arr.len() < n as usize,
88                cbor_event::Len::Indefinite => true,
89            } {
90                if is_break_tag(raw, "PlutusScripts")? {
91                    break;
92                }
93                arr.push(PlutusScript::deserialize_with_version(raw, version)?);
94            }
95            Ok(())
96        })()
97            .map_err(|e| e.annotate("PlutusScripts"))?;
98
99        let set_tag = if has_set_tag {
100            Some(CborSetType::Tagged)
101        } else {
102            Some(CborSetType::Untagged)
103        };
104
105        Ok(Self::from_vec(arr, set_tag))
106    }
107}