Skip to main content

inherence_verifier/
error.rs

1//! Failure codes (SPEC §8 controlled vocabulary).
2
3use thiserror::Error;
4
5#[derive(Debug, Error, Clone, PartialEq, Eq)]
6pub enum VerifyError {
7    #[error("schema_violation: {0}")]
8    SchemaViolation(String),
9
10    #[error("signature_invalid: {0}")]
11    SignatureInvalid(String),
12
13    #[error("wrong_signer")]
14    WrongSigner,
15
16    #[error("expired")]
17    Expired,
18
19    #[error("not_yet_valid")]
20    NotYetValid,
21
22    #[error("wrong_issuer: {0}")]
23    WrongIssuer(String),
24
25    #[error("wrong_audience: {0}")]
26    WrongAudience(String),
27
28    #[error("contract_hash_mismatch")]
29    ContractHashMismatch,
30
31    #[error("principal_signature_invalid:{0}")]
32    PrincipalSignatureInvalid(&'static str), // "principal" | "agent"
33
34    #[error("state_invalid: {0}")]
35    StateInvalid(String),
36
37    #[error("decision_bit_mismatch")]
38    DecisionBitMismatch,
39
40    #[error("unknown_vk: {0}")]
41    UnknownVk(String),
42
43    #[error("internal_inconsistency: {0}")]
44    InternalInconsistency(String),
45
46    #[error("proof_invalid: {0}")]
47    ProofInvalid(String),
48}
49
50impl VerifyError {
51    /// Returns the canonical SPEC §8 code string (without context).
52    /// Used by fixture-replay tests that compare against
53    /// `expected_verdict = "INVALID: <code>"`.
54    pub fn code(&self) -> String {
55        match self {
56            VerifyError::SchemaViolation(_) => "schema_violation".into(),
57            VerifyError::SignatureInvalid(_) => "signature_invalid".into(),
58            VerifyError::WrongSigner => "wrong_signer".into(),
59            VerifyError::Expired => "expired".into(),
60            VerifyError::NotYetValid => "not_yet_valid".into(),
61            VerifyError::WrongIssuer(_) => "wrong_issuer".into(),
62            VerifyError::WrongAudience(_) => "wrong_audience".into(),
63            VerifyError::ContractHashMismatch => "internal_inconsistency".into(),
64            VerifyError::PrincipalSignatureInvalid(role) => format!("principal_signature_invalid:{}", role),
65            VerifyError::StateInvalid(_) => "state_invalid".into(),
66            VerifyError::DecisionBitMismatch => "decision_bit_mismatch".into(),
67            VerifyError::UnknownVk(_) => "unknown_vk".into(),
68            VerifyError::InternalInconsistency(_) => "internal_inconsistency".into(),
69            VerifyError::ProofInvalid(_) => "proof_invalid".into(),
70        }
71    }
72}