nodeinfo/
lib.rs

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
14/// Serialize a NodeInfo struct into a JSON String.
15/// Just a wrapper for serde.
16pub fn serialize<T: Serialize>(value: NodeInfoInternal<T>) -> Result<String> {
17  serde_json::to_string(&value).map_err(NodeInfoError::from)
18}
19
20/// Deserialize a nodeinfo JSON string into the NodeInfo struct.
21/// It can handle versions from v1.0 up to v2.1.
22pub 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
35/// Deserialize a nodeinfo JSON string into the NodeInfoOwned struct.
36/// It can handle versions from v1.0 up to v2.1.
37pub fn deserialize_owned(value: &str) -> Result<NodeInfoOwned> {
38  deserialize(value).map(|x| x.to_owned())
39}