oca_presentation/presentation/
serialization.rs

1use super::Presentation;
2use serde::{ser::SerializeStruct, Serialize};
3
4impl Serialize for Presentation {
5    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
6    where
7        S: serde::Serializer,
8    {
9        // 8 is the number of fields in the struct.
10        let mut state = serializer.serialize_struct("Presentation", 8)?;
11        state.serialize_field("v", &self.version)?;
12        state.serialize_field("bd", &self.bundle_digest)?;
13        state.serialize_field("l", &self.languages)?;
14        let said = opt_serialization::none_as_empty_string(&self.said);
15        state.serialize_field("d", &said)?;
16        state.serialize_field("p", &self.pages)?;
17        state.serialize_field("po", &self.pages_order)?;
18        state.serialize_field("pl", &self.pages_label)?;
19        state.serialize_field("i", &self.interaction)?;
20        state.end()
21    }
22}
23
24pub mod opt_serialization {
25    use std::fmt::Display;
26
27    use said::SelfAddressingIdentifier;
28    use serde::{de::Error, Deserialize, Deserializer};
29
30    pub fn none_as_empty_string<T>(input: &Option<T>) -> String
31    where
32        T: Display,
33    {
34        input
35            .as_ref()
36            .map(|said| said.to_string())
37            .unwrap_or_default()
38    }
39
40    pub fn empty_str_as_none<'de, D>(
41        deserializer: D,
42    ) -> Result<Option<SelfAddressingIdentifier>, D::Error>
43    where
44        D: Deserializer<'de>,
45    {
46        let s = String::deserialize(deserializer)?;
47        if s.is_empty() {
48            Ok(None)
49        } else {
50            let parsed = s.parse().map_err(D::Error::custom)?;
51            Ok(Some(parsed))
52        }
53    }
54}