cardano_serialization_lib/serialization/
native_scripts.rs

1use crate::*;
2use crate::serialization::utils::{is_break_tag, skip_set_tag};
3
4impl cbor_event::se::Serialize for NativeScripts {
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 NativeScripts {
18    pub(crate) fn serialize_as_set<'se, W: Write>(
19        &self,
20        need_deduplication: bool,
21        serializer: &'se mut Serializer<W>,
22    ) -> cbor_event::Result<&'se mut Serializer<W>> {
23        serializer.write_tag(258)?;
24        if need_deduplication {
25            let view = self.deduplicated_view();
26            serializer.write_array(cbor_event::Len::Len(self.scripts.len() as u64))?;
27            for element in view {
28                element.serialize(serializer)?;
29            }
30        } else {
31            serializer.write_array(cbor_event::Len::Len(self.len() as u64))?;
32            for element in self {
33                element.serialize(serializer)?;
34            }
35        }
36        Ok(serializer)
37    }
38}
39
40impl Deserialize for NativeScripts {
41    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
42        let has_tag = skip_set_tag(raw)?;
43        let mut arr = Vec::new();
44        (|| -> Result<_, DeserializeError> {
45            let len = raw.array()?;
46            while match len {
47                cbor_event::Len::Len(n) => arr.len() < n as usize,
48                cbor_event::Len::Indefinite => true,
49            } {
50                if is_break_tag(raw, "NativeScripts")? {
51                    break;
52                }
53                arr.push(NativeScript::deserialize(raw)?);
54            }
55            Ok(())
56        })()
57            .map_err(|e| e.annotate("NativeScripts"))?;
58
59        let set_type = if has_tag {
60            CborSetType::Tagged
61        } else {
62            CborSetType::Untagged
63        };
64
65        Ok(
66            Self {
67                scripts: arr,
68                cbor_tag_type: Some(set_type),
69            }
70        )
71    }
72}