Skip to main content

uor_addr/composition/e8/
pipeline.rs

1//! CS-E8 composition entry points, one per σ-axis (wiki ADR-061 §(2)).
2
3#![cfg(feature = "alloc")]
4
5use crate::composition::canonicalize::{canonicalize_e8, check_axis, decode_operand};
6use crate::composition::e8::model::{
7    CompositionModelE8Blake3, CompositionModelE8Keccak256, CompositionModelE8Sha256,
8    CompositionModelE8Sha3_256, CompositionModelE8Sha512,
9};
10use crate::composition::e8::value::E8Carrier;
11use crate::composition::CompositionFailure;
12use crate::label::KappaLabel;
13use crate::outcome::AddressOutcome;
14use prism::pipeline::PrismModel;
15
16/// CS-E8 under σ-axis `Sha256Hasher`.
17///
18/// # Errors
19///
20/// - [`CompositionFailure::OperandSigmaAxisMismatch`] — an operand's σ-axis
21///   prefix is not `"sha256"`.
22/// - [`CompositionFailure::MalformedOperand`] — an operand is not a
23///   well-formed κ-label.
24/// - [`CompositionFailure::PipelineFailure`] — defensive.
25pub fn compose_e8_embedding(
26    operand: &KappaLabel<71>,
27) -> Result<AddressOutcome<71>, CompositionFailure> {
28    let (axis, _) = decode_operand(operand)?;
29    check_axis(axis, "sha256")?;
30    let canon = canonicalize_e8(operand);
31    let grounded = CompositionModelE8Sha256::forward(E8Carrier::new(&canon))
32        .map_err(|_| CompositionFailure::PipelineFailure)?;
33    AddressOutcome::<71>::from_grounded(&grounded).map_err(|_| CompositionFailure::PipelineFailure)
34}
35/// CS-E8 under σ-axis `Blake3Hasher`.
36///
37/// # Errors
38///
39/// - [`CompositionFailure::OperandSigmaAxisMismatch`] — an operand's σ-axis
40///   prefix is not `"blake3"`.
41/// - [`CompositionFailure::MalformedOperand`] — an operand is not a
42///   well-formed κ-label.
43/// - [`CompositionFailure::PipelineFailure`] — defensive.
44pub fn compose_e8_embedding_blake3(
45    operand: &KappaLabel<71>,
46) -> Result<AddressOutcome<71>, CompositionFailure> {
47    let (axis, _) = decode_operand(operand)?;
48    check_axis(axis, "blake3")?;
49    let canon = canonicalize_e8(operand);
50    let grounded = CompositionModelE8Blake3::forward(E8Carrier::new(&canon))
51        .map_err(|_| CompositionFailure::PipelineFailure)?;
52    AddressOutcome::<71>::from_grounded(&grounded).map_err(|_| CompositionFailure::PipelineFailure)
53}
54/// CS-E8 under σ-axis `Sha3_256Hasher`.
55///
56/// # Errors
57///
58/// - [`CompositionFailure::OperandSigmaAxisMismatch`] — an operand's σ-axis
59///   prefix is not `"sha3-256"`.
60/// - [`CompositionFailure::MalformedOperand`] — an operand is not a
61///   well-formed κ-label.
62/// - [`CompositionFailure::PipelineFailure`] — defensive.
63pub fn compose_e8_embedding_sha3_256(
64    operand: &KappaLabel<73>,
65) -> Result<AddressOutcome<73>, CompositionFailure> {
66    let (axis, _) = decode_operand(operand)?;
67    check_axis(axis, "sha3-256")?;
68    let canon = canonicalize_e8(operand);
69    let grounded = CompositionModelE8Sha3_256::forward(E8Carrier::new(&canon))
70        .map_err(|_| CompositionFailure::PipelineFailure)?;
71    AddressOutcome::<73>::from_grounded(&grounded).map_err(|_| CompositionFailure::PipelineFailure)
72}
73/// CS-E8 under σ-axis `Keccak256Hasher`.
74///
75/// # Errors
76///
77/// - [`CompositionFailure::OperandSigmaAxisMismatch`] — an operand's σ-axis
78///   prefix is not `"keccak256"`.
79/// - [`CompositionFailure::MalformedOperand`] — an operand is not a
80///   well-formed κ-label.
81/// - [`CompositionFailure::PipelineFailure`] — defensive.
82pub fn compose_e8_embedding_keccak256(
83    operand: &KappaLabel<74>,
84) -> Result<AddressOutcome<74>, CompositionFailure> {
85    let (axis, _) = decode_operand(operand)?;
86    check_axis(axis, "keccak256")?;
87    let canon = canonicalize_e8(operand);
88    let grounded = CompositionModelE8Keccak256::forward(E8Carrier::new(&canon))
89        .map_err(|_| CompositionFailure::PipelineFailure)?;
90    AddressOutcome::<74>::from_grounded(&grounded).map_err(|_| CompositionFailure::PipelineFailure)
91}
92/// CS-E8 under σ-axis `Sha512Hasher`.
93///
94/// # Errors
95///
96/// - [`CompositionFailure::OperandSigmaAxisMismatch`] — an operand's σ-axis
97///   prefix is not `"sha512"`.
98/// - [`CompositionFailure::MalformedOperand`] — an operand is not a
99///   well-formed κ-label.
100/// - [`CompositionFailure::PipelineFailure`] — defensive.
101pub fn compose_e8_embedding_sha512(
102    operand: &KappaLabel<135>,
103) -> Result<AddressOutcome<135, 64>, CompositionFailure> {
104    let (axis, _) = decode_operand(operand)?;
105    check_axis(axis, "sha512")?;
106    let canon = canonicalize_e8(operand);
107    let grounded = CompositionModelE8Sha512::forward(E8Carrier::new(&canon))
108        .map_err(|_| CompositionFailure::PipelineFailure)?;
109    AddressOutcome::<135, 64>::from_grounded(&grounded)
110        .map_err(|_| CompositionFailure::PipelineFailure)
111}