#![cfg_attr(not(target_arch = "wasm32"), allow(dead_code))]
#[cfg(target_arch = "wasm32")]
mod component {
use std::string::ToString;
use std::vec::Vec;
wit_bindgen::generate!({
world: "uor-addr",
path: "wit/uor-addr.wit",
generate_all,
});
use exports::uor::addr::kappa::{
AddressError, Grounded, Guest, GuestGrounded, KappaLabel, VerifyError,
};
pub struct UorAddrComponent;
pub struct GroundedImpl {
outcome: uor_addr::AddressOutcome,
}
impl GuestGrounded for GroundedImpl {
fn kappa_label(&self) -> KappaLabel {
self.outcome.address.as_str().to_string()
}
fn content_fingerprint(&self) -> Vec<u8> {
self.outcome
.witness
.grounded()
.content_fingerprint()
.as_bytes()
.to_vec()
}
fn verify(&self) -> Result<KappaLabel, VerifyError> {
let grounded = self.outcome.witness.grounded();
let trace: prism_verify::Trace<256> = grounded.derivation().replay();
let certified = prism_verify::certify_from_trace(&trace).map_err(map_replay_error)?;
if certified.certificate().content_fingerprint() != grounded.content_fingerprint() {
return Err(VerifyError::OutOfOrderEvent);
}
Ok(self.outcome.address.as_str().to_string())
}
}
fn map_replay_error(e: prism_verify::ReplayError) -> VerifyError {
match e {
prism_verify::ReplayError::EmptyTrace => VerifyError::EmptyTrace,
prism_verify::ReplayError::OutOfOrderEvent { .. } => VerifyError::OutOfOrderEvent,
prism_verify::ReplayError::ZeroTarget { .. } => VerifyError::ZeroTarget,
prism_verify::ReplayError::NonContiguousSteps { .. } => VerifyError::NonContiguousSteps,
prism_verify::ReplayError::CapacityExceeded { .. } => VerifyError::CapacityExceeded,
_ => VerifyError::EmptyTrace,
}
}
macro_rules! map_addr {
($result:expr, $err_ty:path, $invalid:path) => {
match $result {
Ok(outcome) => Ok(outcome.address.as_str().to_string()),
Err($invalid) => Err(AddressError::InvalidInput),
Err(<$err_ty>::TooLarge) => Err(AddressError::TooLarge),
Err(<$err_ty>::PipelineFailure) => Err(AddressError::PipelineFailure),
}
};
}
macro_rules! map_witness {
($result:expr, $err_ty:path, $invalid:path) => {
match $result {
Ok(outcome) => Ok(Grounded::new(GroundedImpl { outcome })),
Err($invalid) => Err(AddressError::InvalidInput),
Err(<$err_ty>::TooLarge) => Err(AddressError::TooLarge),
Err(<$err_ty>::PipelineFailure) => Err(AddressError::PipelineFailure),
}
};
}
impl Guest for UorAddrComponent {
type Grounded = GroundedImpl;
fn json_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
map_addr!(
uor_addr::json::address(&input),
uor_addr::json::AddressFailure,
uor_addr::json::AddressFailure::InvalidJson
)
}
fn sexp_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
map_addr!(
uor_addr::sexp::address(&input),
uor_addr::sexp::AddressFailure,
uor_addr::sexp::AddressFailure::InvalidSExpr
)
}
fn xml_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
map_addr!(
uor_addr::xml::address(&input),
uor_addr::xml::AddressFailure,
uor_addr::xml::AddressFailure::InvalidXml
)
}
fn asn1_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
map_addr!(
uor_addr::asn1::address(&input),
uor_addr::asn1::AddressFailure,
uor_addr::asn1::AddressFailure::InvalidDer
)
}
fn ring_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
map_addr!(
uor_addr::ring::address(&input),
uor_addr::ring::AddressFailure,
uor_addr::ring::AddressFailure::InvalidRingElement
)
}
fn codemodule_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
map_addr!(
uor_addr::codemodule::address(&input),
uor_addr::codemodule::AddressFailure,
uor_addr::codemodule::AddressFailure::InvalidCcmas
)
}
fn schema_photo_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
map_addr!(
uor_addr::schema::photo::address(&input),
uor_addr::schema::photo::AddressFailure,
uor_addr::schema::photo::AddressFailure::SchemaViolation
)
}
fn schema_document_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
map_addr!(
uor_addr::schema::document::address(&input),
uor_addr::schema::document::AddressFailure,
uor_addr::schema::document::AddressFailure::SchemaViolation
)
}
fn schema_codemodule_signed_address(input: Vec<u8>) -> Result<KappaLabel, AddressError> {
map_addr!(
uor_addr::schema::codemodule_signed::address(&input),
uor_addr::schema::codemodule_signed::AddressFailure,
uor_addr::schema::codemodule_signed::AddressFailure::SchemaViolation
)
}
fn json_address_with_witness(input: Vec<u8>) -> Result<Grounded, AddressError> {
map_witness!(
uor_addr::json::address(&input),
uor_addr::json::AddressFailure,
uor_addr::json::AddressFailure::InvalidJson
)
}
fn sexp_address_with_witness(input: Vec<u8>) -> Result<Grounded, AddressError> {
map_witness!(
uor_addr::sexp::address(&input),
uor_addr::sexp::AddressFailure,
uor_addr::sexp::AddressFailure::InvalidSExpr
)
}
fn xml_address_with_witness(input: Vec<u8>) -> Result<Grounded, AddressError> {
map_witness!(
uor_addr::xml::address(&input),
uor_addr::xml::AddressFailure,
uor_addr::xml::AddressFailure::InvalidXml
)
}
fn asn1_address_with_witness(input: Vec<u8>) -> Result<Grounded, AddressError> {
map_witness!(
uor_addr::asn1::address(&input),
uor_addr::asn1::AddressFailure,
uor_addr::asn1::AddressFailure::InvalidDer
)
}
fn ring_address_with_witness(input: Vec<u8>) -> Result<Grounded, AddressError> {
map_witness!(
uor_addr::ring::address(&input),
uor_addr::ring::AddressFailure,
uor_addr::ring::AddressFailure::InvalidRingElement
)
}
fn codemodule_address_with_witness(input: Vec<u8>) -> Result<Grounded, AddressError> {
map_witness!(
uor_addr::codemodule::address(&input),
uor_addr::codemodule::AddressFailure,
uor_addr::codemodule::AddressFailure::InvalidCcmas
)
}
fn schema_photo_address_with_witness(input: Vec<u8>) -> Result<Grounded, AddressError> {
map_witness!(
uor_addr::schema::photo::address(&input),
uor_addr::schema::photo::AddressFailure,
uor_addr::schema::photo::AddressFailure::SchemaViolation
)
}
fn schema_document_address_with_witness(input: Vec<u8>) -> Result<Grounded, AddressError> {
map_witness!(
uor_addr::schema::document::address(&input),
uor_addr::schema::document::AddressFailure,
uor_addr::schema::document::AddressFailure::SchemaViolation
)
}
fn schema_codemodule_signed_address_with_witness(
input: Vec<u8>,
) -> Result<Grounded, AddressError> {
map_witness!(
uor_addr::schema::codemodule_signed::address(&input),
uor_addr::schema::codemodule_signed::AddressFailure,
uor_addr::schema::codemodule_signed::AddressFailure::SchemaViolation
)
}
}
export!(UorAddrComponent);
}