Skip to main content

substrate/model/
mod.rs

1//! Typed protocol models for CMN.
2
3use anyhow::{anyhow, Result};
4use serde_json::Value;
5
6mod cmn;
7mod format;
8mod mycelium;
9mod spore;
10mod taste;
11mod trust;
12
13pub use self::cmn::*;
14pub use self::format::format_cmn_entry;
15pub use self::format::format_spore_core_draft;
16pub use self::format::PrettyJson;
17pub use self::mycelium::*;
18pub use self::spore::*;
19pub use self::taste::*;
20pub use self::trust::*;
21
22fn verify_expected_uri_hash(actual_hash: &str, expected_hash: &str) -> Result<()> {
23    let expected_hash = crate::parse_hash(expected_hash)?;
24    let expected_hash_text = crate::format_hash(expected_hash.algorithm, &expected_hash.bytes);
25
26    if actual_hash != expected_hash_text {
27        return Err(anyhow!(
28            "URI hash mismatch!\n  Expected: {}\n  Actual:   {}",
29            expected_hash_text,
30            actual_hash
31        ));
32    }
33
34    Ok(())
35}
36
37pub fn decode_spore(payload: &Value) -> Result<Spore> {
38    serde_json::from_value(payload.clone()).map_err(|e| anyhow!("Failed to decode spore: {}", e))
39}
40
41pub fn decode_mycelium(payload: &Value) -> Result<Mycelium> {
42    serde_json::from_value(payload.clone()).map_err(|e| anyhow!("Failed to decode mycelium: {}", e))
43}
44
45pub fn decode_cmn_entry(payload: &Value) -> Result<CmnEntry> {
46    serde_json::from_value(payload.clone()).map_err(|e| anyhow!("Failed to decode cmn.json: {}", e))
47}
48
49pub fn decode_taste(payload: &Value) -> Result<Taste> {
50    serde_json::from_value(payload.clone())
51        .map_err(|e| anyhow!("Failed to decode taste report: {}", e))
52}