cardano_serialization_lib/serialization/governance/proposals/
committee.rs

1use crate::serialization::utils::{check_len, is_break_tag};
2use crate::*;
3use std::collections::BTreeMap;
4
5impl Serialize for Committee {
6    fn serialize<'se, W: Write>(
7        &self,
8        serializer: &'se mut Serializer<W>,
9    ) -> cbor_event::Result<&'se mut Serializer<W>> {
10        serializer.write_array(cbor_event::Len::Len(2))?;
11        self.serialize_as_embedded_group(serializer)?;
12        Ok(serializer)
13    }
14}
15
16impl SerializeEmbeddedGroup for Committee {
17    fn serialize_as_embedded_group<'a, W: Write + Sized>(&self, serializer: &'a mut Serializer<W>) -> cbor_event::Result<&'a mut Serializer<W>> {
18        serializer.write_map(cbor_event::Len::Len(self.members.len() as u64))?;
19        for (key, value) in &self.members {
20            key.serialize(serializer)?;
21            value.serialize(serializer)?;
22        }
23        self.quorum_threshold.serialize(serializer)?;
24        Ok(serializer)
25    }
26}
27
28impl_deserialize_for_wrapped_tuple!(Committee);
29
30impl DeserializeEmbeddedGroup for Committee {
31    fn deserialize_as_embedded_group<R: BufRead + Seek>(
32        raw: &mut Deserializer<R>,
33        len: cbor_event::Len,
34    ) -> Result<Self, DeserializeError> {
35        check_len(len, 2, "(members, quorum_threshold)")?;
36
37        let mut table = BTreeMap::new();
38        let map_len = raw.map()?;
39        while match map_len {
40            cbor_event::Len::Len(n) => table.len() < n as usize,
41            cbor_event::Len::Indefinite => true,
42        } {
43            if is_break_tag(raw, "Committee")? {
44                break;
45            }
46            let key = Credential::deserialize(raw)?;
47            let value = Epoch::deserialize(raw)?;
48            if table.insert(key.clone(), value).is_some() {
49                return Err(DeserializeFailure::DuplicateKey(Key::Str(String::from(
50                    "some complicated/unsupported type",
51                )))
52                .into());
53            }
54        }
55        let quorum_threshold = UnitInterval::deserialize(raw)?;
56
57        Ok(Committee {
58            quorum_threshold,
59            members: table,
60        })
61    }
62}