1use thiserror::Error;
4
5#[derive(Debug, Error)]
7pub enum StoreError {
8 #[error("Baseline already exists: {0}")]
10 AlreadyExists(String),
11
12 #[error("Baseline not found: {0}")]
14 NotFound(String),
15
16 #[error("Database connection error: {0}")]
18 ConnectionError(String),
19
20 #[error("Query error: {0}")]
22 QueryError(String),
23
24 #[error("Serialization error: {0}")]
26 SerializationError(#[from] serde_json::Error),
27
28 #[error("IO error: {0}")]
30 IoError(#[from] std::io::Error),
31
32 #[error("SQLite error: {0}")]
34 SqliteError(#[from] rusqlite::Error),
35
36 #[error("Lock error: {0}")]
38 LockError(String),
39
40 #[error("{0}")]
42 Other(String),
43}
44
45impl StoreError {
46 pub fn already_exists(project: &str, benchmark: &str, version: &str) -> Self {
48 Self::AlreadyExists(format!(
49 "project={}, benchmark={}, version={}",
50 project, benchmark, version
51 ))
52 }
53
54 pub fn not_found(project: &str, benchmark: &str, version: &str) -> Self {
56 Self::NotFound(format!(
57 "project={}, benchmark={}, version={}",
58 project, benchmark, version
59 ))
60 }
61}
62
63#[derive(Debug, Error)]
65pub enum AuthError {
66 #[error("Missing authentication header")]
68 MissingAuth,
69
70 #[error("Invalid API key format")]
72 InvalidKeyFormat,
73
74 #[error("Invalid API key")]
76 InvalidKey,
77
78 #[error("API key has expired")]
80 ExpiredKey,
81
82 #[error("Invalid JWT token: {0}")]
84 InvalidToken(String),
85
86 #[error("JWT token has expired")]
88 ExpiredToken,
89
90 #[error("Insufficient permissions: required {required}, has {actual}")]
92 InsufficientPermissions { required: String, actual: String },
93}
94
95#[derive(Debug, Error)]
97pub enum ConfigError {
98 #[error("Invalid configuration: {0}")]
100 InvalidValue(String),
101
102 #[error("Missing required configuration: {0}")]
104 MissingRequired(String),
105
106 #[error("Configuration file error: {0}")]
108 FileError(#[from] std::io::Error),
109
110 #[error("Configuration parse error: {0}")]
112 ParseError(String),
113}