cardano_serialization_lib/serialization/plutus/
plutus_scripts.rs1use 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}