Skip to main content

kbolt_core/
error.rs

1use kbolt_types::KboltError;
2use thiserror::Error;
3
4#[derive(Debug, Error)]
5pub enum CoreError {
6    #[error(transparent)]
7    Domain(#[from] KboltError),
8
9    #[error("database error: {0}")]
10    Sqlite(#[from] rusqlite::Error),
11
12    #[error("toml decode error: {0}")]
13    TomlDe(#[from] toml::de::Error),
14
15    #[error("toml encode error: {0}")]
16    TomlSer(#[from] toml::ser::Error),
17
18    #[error("json error: {0}")]
19    Json(#[from] serde_json::Error),
20
21    #[error("tantivy error: {0}")]
22    Tantivy(#[from] tantivy::TantivyError),
23
24    #[error("io error: {0}")]
25    Io(#[from] std::io::Error),
26
27    #[error("internal error: {0}")]
28    Internal(String),
29}
30
31impl CoreError {
32    pub fn poisoned(resource: &str) -> Self {
33        Self::Internal(format!("{resource} mutex poisoned"))
34    }
35}
36
37impl From<CoreError> for KboltError {
38    fn from(value: CoreError) -> Self {
39        match value {
40            CoreError::Domain(err) => err,
41            CoreError::Sqlite(err) => KboltError::Database(err.to_string()),
42            CoreError::TomlDe(err) => KboltError::Config(format!("failed to parse config: {err}")),
43            CoreError::TomlSer(err) => {
44                KboltError::Config(format!("failed to serialize config: {err}"))
45            }
46            CoreError::Json(err) => KboltError::Internal(format!("json error: {err}")),
47            CoreError::Tantivy(err) => KboltError::Tantivy(err.to_string()),
48            CoreError::Io(err) => KboltError::Io(err),
49            CoreError::Internal(msg) => KboltError::Internal(msg),
50        }
51    }
52}
53
54pub type Result<T> = std::result::Result<T, CoreError>;