Skip to main content

miden_objects/decoded/
error.rs

1use alloc::boxed::Box;
2use core::error::Error;
3
4#[cfg(test)]
5mod tests;
6
7/// A verification failure from a composite object, preserving its concrete domain source.
8///
9/// Nested verifiers propagate this wrapper unchanged instead of introducing an error enum at
10/// every layer. Inspect [`Error::source`] to distinguish domain failures or the invariant errors
11/// defined alongside individual verifiers. Unlike structural decoding errors, these errors do
12/// not have generated wire paths.
13#[derive(Debug, thiserror::Error)]
14#[error("{0}")]
15pub struct VerificationError(#[source] Box<dyn Error + Send + Sync>);
16
17impl VerificationError {
18    pub fn new(source: impl Error + Send + Sync + 'static) -> Self {
19        let source: Box<dyn Error + Send + Sync> = Box::new(source);
20        match source.downcast::<Self>() {
21            Ok(error) => *error,
22            Err(source) => Self(source),
23        }
24    }
25}
26
27macro_rules! impl_verification_error_from {
28    ($($ty:ty),* $(,)?) => {$(
29        impl From<$ty> for VerificationError {
30            fn from(error: $ty) -> Self {
31                Self::new(error)
32            }
33        }
34    )*};
35}
36
37impl_verification_error_from!(
38    core::num::TryFromIntError,
39    miden_protocol::assembly::mast::MastForestError,
40    miden_protocol::block::SignedBlockError,
41    miden_protocol::crypto::merkle::MerkleError,
42    miden_protocol::crypto::merkle::mmr::MmrError,
43    miden_protocol::crypto::merkle::smt::SmtLeafError,
44    miden_protocol::crypto::merkle::smt::SmtProofError,
45    miden_protocol::errors::AccountError,
46    miden_protocol::errors::AccountIdError,
47    miden_protocol::errors::AccountPatchError,
48    miden_protocol::errors::AccountTreeError,
49    miden_protocol::errors::AssetError,
50    miden_protocol::errors::BatchAccountUpdateError,
51    miden_protocol::errors::BlockAccountUpdateError,
52    miden_protocol::errors::BlockBodyError,
53    miden_protocol::errors::NoteError,
54    miden_protocol::errors::OutputNoteError,
55    miden_protocol::errors::PartialAssetVaultError,
56    miden_protocol::errors::PartialBlockchainError,
57    miden_protocol::errors::ProposedBatchError,
58    miden_protocol::errors::ProtocolConfigError,
59    miden_protocol::errors::ProvenBatchError,
60    miden_protocol::errors::ProvenTransactionError,
61    miden_protocol::errors::StorageSlotNameError,
62    miden_protocol::errors::TransactionHeaderError,
63    miden_protocol::errors::TransactionInputError,
64    miden_protocol::errors::ValidatorConfigError,
65    miden_protocol::utils::serde::DeserializationError,
66    super::account::AccountHeaderError,
67    super::account::AccountPatchError,
68    super::account::PartialStorageError,
69    super::account::StorageMapPatchError,
70    super::account::VaultPatchError,
71    super::asset::AssetIdError,
72    super::blockchain::BlockHeaderError,
73    super::blockchain::PartialBlockchainError,
74    super::note::NoteMetadataError,
75    super::primitives::AdviceError,
76    super::primitives::PartialSmtError,
77    super::transaction::ForeignAccountSlotNameError,
78    super::transaction::InputNoteError,
79    super::transaction::ProposedBatchError,
80    super::transaction::ProvenBatchError,
81    super::transaction::TransactionArgsError,
82    super::transaction::TransactionHeaderBuildError,
83    super::transaction::TransactionInputsError,
84);