1use 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}