use crate::models::bundle::SynthesisBundle;
use crate::util::sha256_hex_json;
pub fn canonical_hash(bundle: &SynthesisBundle) -> String {
sha256_hex_json(bundle).expect("SynthesisBundle is always JSON-serializable")
}
#[cfg(test)]
mod tests {
use super::*;
use crate::models::bundle::{BundleAuthority, SynthesisPayload};
use chrono::Utc;
fn bundle() -> SynthesisBundle {
SynthesisBundle {
timestamp: Utc::now(),
source: "t".into(),
sequence: 1,
payload: SynthesisPayload::Dna {
sequence: "ATGC".into(),
},
delta_time: 0.0,
authority: BundleAuthority {
pca_chain: String::new(),
required_ops: vec![],
},
metadata: Default::default(),
}
}
#[test]
fn canonical_hash_starts_with_prefix() {
let h = canonical_hash(&bundle());
assert!(h.starts_with("sha256:"));
}
#[test]
fn canonical_hash_deterministic() {
let b = bundle();
assert_eq!(canonical_hash(&b), canonical_hash(&b));
}
}