use base64::{Engine as _, engine::general_purpose::STANDARD};
use sha2::{Digest, Sha256};
use thiserror::Error;
use crate::Document;
#[derive(Debug, Error)]
pub enum CanonicalError {
#[error("canonical JSON error: {0}")]
Serialize(#[from] serde_json::Error),
}
pub fn canonical_json(value: &impl serde::Serialize) -> Result<Vec<u8>, CanonicalError> {
Ok(serde_jcs::to_vec(value)?)
}
pub fn graph_digest(document: &Document) -> Result<String, CanonicalError> {
let digest = Sha256::digest(canonical_json(document)?);
Ok(format!("sha256-{}", STANDARD.encode(digest)))
}