nodeinfo-upub 0.0.3

de-/serialize nodeinfo json structs (upub fork)
Documentation
mod error;
pub mod types;

#[cfg(test)]
mod tests;

pub use error::NodeInfoError;
use serde::Serialize;
pub use types::{LegacyNodeInfo, NodeInfo, NodeInfoOwned};

use error::Result;
use types::{NodeInfoInternal, NodeVersion};

/// Serialize a NodeInfo struct into a JSON String.
/// Just a wrapper for serde.
pub fn serialize<T: Serialize>(value: NodeInfoInternal<T>) -> Result<String> {
  serde_json::to_string(&value).map_err(NodeInfoError::from)
}

/// Deserialize a nodeinfo JSON string into the NodeInfo struct.
/// It can handle versions from v1.0 up to v2.1.
pub fn deserialize(value: &str) -> Result<NodeInfo> {
  let node_info_version: NodeVersion = serde_json::from_str(value)?;

  match node_info_version.version {
    "2.0" | "2.1" => serde_json::from_str(value).map_err(NodeInfoError::from),
    "1.0" | "1.1" => match serde_json::from_str::<LegacyNodeInfo>(value) {
      Ok(legacy_info) => Ok(legacy_info.into()),
      Err(err) => Err(NodeInfoError::from(err)),
    },
    _ => Err(NodeInfoError::UnsupportedVersion),
  }
}

/// Deserialize a nodeinfo JSON string into the NodeInfoOwned struct.
/// It can handle versions from v1.0 up to v2.1.
pub fn deserialize_owned(value: &str) -> Result<NodeInfoOwned> {
  deserialize(value).map(|x| x.to_owned())
}