1mod error;
2mod types;
3
4#[cfg(test)]
5mod tests;
6
7pub use error::NodeInfoError;
8use serde::Serialize;
9pub use types::{NodeInfo, NodeInfoOwned};
10
11use error::Result;
12use types::{LegacyNodeInfo, NodeInfoInternal, NodeVersion};
13
14pub fn serialize<T: Serialize>(value: NodeInfoInternal<T>) -> Result<String> {
17 serde_json::to_string(&value).map_err(NodeInfoError::from)
18}
19
20pub fn deserialize(value: &str) -> Result<NodeInfo> {
23 let node_info_version: NodeVersion = serde_json::from_str(value)?;
24
25 match node_info_version.version {
26 "2.0" | "2.1" => serde_json::from_str(value).map_err(NodeInfoError::from),
27 "1.0" | "1.1" => match serde_json::from_str::<LegacyNodeInfo>(value) {
28 Ok(legacy_info) => Ok(legacy_info.into()),
29 Err(err) => Err(NodeInfoError::from(err)),
30 },
31 _ => Err(NodeInfoError::UnsupportedVersion),
32 }
33}
34
35pub fn deserialize_owned(value: &str) -> Result<NodeInfoOwned> {
38 deserialize(value).map(|x| x.to_owned())
39}