google_cloud_wkt/
message.rs1pub(crate) type Map = serde_json::Map<String, serde_json::Value>;
18use crate::AnyError as Error;
19
20pub trait Message {
26 fn typename() -> &'static str;
28
29 fn to_map(&self) -> Result<Map, Error>
31 where
32 Self: serde::ser::Serialize + Sized,
33 {
34 to_json_object(self)
35 }
36
37 fn from_map(map: &Map) -> Result<Self, Error>
39 where
40 Self: serde::de::DeserializeOwned,
41 {
42 serde_json::from_value::<Self>(serde_json::Value::Object(map.clone())).map_err(Error::deser)
43 }
44}
45
46pub(crate) fn to_json_object<T>(message: &T) -> Result<Map, Error>
47where
48 T: Message + serde::ser::Serialize,
49{
50 use serde_json::Value;
51
52 let value = serde_json::to_value(message).map_err(Error::ser)?;
53 match value {
54 Value::Object(mut map) => {
55 map.insert(
56 "@type".to_string(),
57 Value::String(T::typename().to_string()),
58 );
59 Ok(map)
60 }
61 _ => Err(unexpected_json_type()),
62 }
63}
64
65pub(crate) fn to_json_string<T>(message: &T) -> Result<Map, Error>
66where
67 T: Message + serde::ser::Serialize,
68{
69 use serde_json::Value;
70 let value = serde_json::to_value(message).map_err(Error::ser)?;
71 match value {
72 Value::String(s) => {
73 let map: Map = [("@type", T::typename().to_string()), ("value", s)]
77 .into_iter()
78 .map(|(k, v)| (k.to_string(), Value::String(v)))
79 .collect();
80 Ok(map)
81 }
82 _ => Err(unexpected_json_type()),
83 }
84}
85
86pub(crate) fn from_value<T>(map: &Map) -> Result<T, Error>
87where
88 T: serde::de::DeserializeOwned,
89{
90 map.get("value")
91 .map(|v| serde_json::from_value::<T>(v.clone()))
92 .ok_or_else(missing_value_field)?
93 .map_err(Error::deser)
94}
95
96pub(crate) fn missing_value_field() -> Error {
97 Error::deser("value field is missing")
98}
99
100fn unexpected_json_type() -> Error {
101 Error::ser("unexpected JSON type, only Object and String are supported")
102}