Skip to main content

snoai_mda_config/
errors.rs

1use serde_json::Value;
2use thiserror::Error;
3
4pub type Result<T> = std::result::Result<T, MdaConfigError>;
5
6#[derive(Debug, Clone, PartialEq, Eq)]
7pub enum ErrorCategory {
8    InvalidEncoding,
9    UnterminatedFrontmatter,
10    MissingRequiredFrontmatter,
11    FrontmatterYamlParseError,
12    SchemaViolation,
13    SignatureDigestMismatch,
14    SignaturesWithoutIntegrity,
15    MissingRequiredIntegrity,
16    MissingRequiredSignature,
17    IntegrityMismatch,
18    RekorEntryTypeMismatch,
19    RekorInclusionFailure,
20    FulcioChainFailure,
21    SignatureVerificationFailure,
22    NoTrustedSignature,
23    InsufficientTrustedSignatures,
24    TrustPolicyViolation,
25    UnknownSignerMethod,
26    RequiresNotSatisfied,
27    ProjectSchemaViolation,
28}
29
30impl ErrorCategory {
31    pub fn as_str(&self) -> &'static str {
32        match self {
33            Self::InvalidEncoding => "invalid-encoding",
34            Self::UnterminatedFrontmatter => "unterminated-frontmatter",
35            Self::MissingRequiredFrontmatter => "missing-required-frontmatter",
36            Self::FrontmatterYamlParseError => "frontmatter-yaml-parse-error",
37            Self::SchemaViolation => "schema-violation",
38            Self::SignatureDigestMismatch => "signature-digest-mismatch",
39            Self::SignaturesWithoutIntegrity => "signatures-without-integrity",
40            Self::MissingRequiredIntegrity => "missing-required-integrity",
41            Self::MissingRequiredSignature => "missing-required-signature",
42            Self::IntegrityMismatch => "integrity-mismatch",
43            Self::RekorEntryTypeMismatch => "rekor-entry-type-mismatch",
44            Self::RekorInclusionFailure => "rekor-inclusion-failure",
45            Self::FulcioChainFailure => "fulcio-chain-failure",
46            Self::SignatureVerificationFailure => "signature-verification-failure",
47            Self::NoTrustedSignature => "no-trusted-signature",
48            Self::InsufficientTrustedSignatures => "insufficient-trusted-signatures",
49            Self::TrustPolicyViolation => "trust-policy-violation",
50            Self::UnknownSignerMethod => "unknown-signer-method",
51            Self::RequiresNotSatisfied => "requires-not-satisfied",
52            Self::ProjectSchemaViolation => "project-schema-violation",
53        }
54    }
55}
56
57impl std::fmt::Display for ErrorCategory {
58    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
59        f.write_str(self.as_str())
60    }
61}
62
63#[derive(Debug, Error)]
64#[error("[{category}] {message}")]
65pub struct MdaConfigError {
66    pub category: ErrorCategory,
67    pub message: String,
68    pub details: Value,
69}
70
71impl MdaConfigError {
72    pub fn new(category: ErrorCategory, message: impl Into<String>) -> Self {
73        Self {
74            category,
75            message: message.into(),
76            details: Value::Object(Default::default()),
77        }
78    }
79
80    pub fn with_details(
81        category: ErrorCategory,
82        message: impl Into<String>,
83        details: Value,
84    ) -> Self {
85        Self {
86            category,
87            message: message.into(),
88            details,
89        }
90    }
91}