cardano_serialization_lib/serialization/governance/
anchor.rs

1use crate::serialization::utils::check_len;
2use crate::*;
3
4impl cbor_event::se::Serialize for Anchor {
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(2))?;
10        self.anchor_url.serialize(serializer)?;
11        self.anchor_data_hash.serialize(serializer)?;
12        Ok(serializer)
13    }
14}
15
16impl Deserialize for Anchor {
17    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
18        (|| -> Result<_, DeserializeError> {
19            let len = raw.array()?;
20
21            check_len(len, 2, "(anchor_url, anchor_data_hash)")?;
22
23            let anchor_url = URL::deserialize(raw).map_err(|e| e.annotate("anchor_url"))?;
24
25            let anchor_data_hash =
26                AnchorDataHash::deserialize(raw).map_err(|e| e.annotate("anchor_data_hash"))?;
27
28            if let cbor_event::Len::Indefinite = len {
29                if raw.special()? != CBORSpecial::Break {
30                    return Err(DeserializeFailure::EndingBreakMissing.into());
31                }
32            }
33
34            return Ok(Anchor {
35                anchor_url,
36                anchor_data_hash,
37            });
38        })()
39        .map_err(|e| e.annotate("Anchor"))
40    }
41}