1use actix_web::http::StatusCode;
2use actix_web::ResponseError;
3use thiserror::Error;
4
5#[derive(Debug, Error)]
6pub enum CspError {
7 #[error("Invalid directive value: {0}")]
8 InvalidDirectiveValue(String),
9
10 #[error("Invalid directive name: {0}")]
11 InvalidDirectiveName(String),
12
13 #[error("Invalid hash algorithm: {0}")]
14 InvalidHashAlgorithm(String),
15
16 #[error("Invalid nonce value: {0}")]
17 InvalidNonceValue(String),
18
19 #[error("Invalid report URI: {0}")]
20 InvalidReportUri(String),
21
22 #[error("Crypto error: {0}")]
23 CryptoError(String),
24
25 #[error("Serialization error: {0}")]
26 SerializationError(String),
27
28 #[error("Header processing error: {0}")]
29 HeaderError(String),
30
31 #[error("Policy validation error: {0}")]
32 ValidationError(String),
33
34 #[error("Report processing error: {0}")]
35 ReportError(String),
36
37 #[error("Policy verification error: {0}")]
38 VerificationError(String),
39
40 #[error("Config error: {0}")]
41 ConfigError(String),
42
43 #[error("I/O error: {0}")]
44 IoError(#[from] std::io::Error),
45}
46
47impl ResponseError for CspError {
48 fn status_code(&self) -> StatusCode {
49 match self {
50 Self::InvalidDirectiveValue(_)
51 | Self::InvalidDirectiveName(_)
52 | Self::InvalidHashAlgorithm(_)
53 | Self::InvalidNonceValue(_)
54 | Self::InvalidReportUri(_)
55 | Self::ValidationError(_)
56 | Self::VerificationError(_)
57 | Self::ConfigError(_) => StatusCode::BAD_REQUEST,
58
59 Self::CryptoError(_)
60 | Self::SerializationError(_)
61 | Self::HeaderError(_)
62 | Self::ReportError(_)
63 | Self::IoError(_) => StatusCode::INTERNAL_SERVER_ERROR,
64 }
65 }
66}