oca_presentation/presentation/
serialization.rs1use 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 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}