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