1#![forbid(unsafe_code)]
2#![deny(missing_docs)]
3#![allow(clippy::multiple_crate_versions)]
4pub mod capsule;
10#[cfg(feature = "sqlite")]
12pub mod idempotency;
13pub mod receipt;
15#[cfg(feature = "server")]
17pub mod server;
18#[cfg(feature = "http")]
20pub mod transport_http;
21pub mod wire;
23
24pub use capsule::{build_capsule, parse_capsule, CapsuleBytes};
25pub use receipt::{sign_receipt, verify_receipt, Receipt};
26pub use wire::{
27 decode_frame, encode_frame, CanonIntent, SirpError, SirpFrame, DOMAIN_FRAME_SIGN, FLAG_SIGNED,
28 SIRP_MAGIC, SIRP_VERSION,
29};
30
31pub fn canon_intent_from_value(v: &serde_json::Value) -> Result<CanonIntent, SirpError> {
40 let bytes = json_atomic::canonize(v).map_err(|e| SirpError::Canon(format!("{e:?}")))?;
41 let cid = ubl_crypto::blake3_cid(&bytes);
42 Ok(CanonIntent { cid, bytes })
43}