anda_db/
error.rs

1//! Error types for schema module
2use anda_db_btree::BTreeError;
3use anda_db_hnsw::HnswError;
4use anda_db_tfs::BM25Error;
5use thiserror::Error;
6
7use crate::schema::{BoxError, SchemaError};
8
9/// Anda DB related errors
10#[derive(Error, Debug)]
11pub enum DBError {
12    #[error("Anda DB {name:?} error: {source:?}")]
13    Generic { name: String, source: BoxError },
14
15    #[error("Collection {name:?} error: {source:?}")]
16    Collection { name: String, source: BoxError },
17
18    #[error("Schema error: {source:?}")]
19    Schema { name: String, source: BoxError },
20
21    #[error("Storage error: {source:?}")]
22    Storage { name: String, source: BoxError },
23
24    #[error("Index error: {source:?}")]
25    Index { name: String, source: BoxError },
26
27    #[error("Object {name} at location {path} not found: {source:?}")]
28    NotFound {
29        name: String,
30        path: String,
31        source: BoxError,
32    },
33
34    #[error("Object {name} at location {path} already exists: {source:?}")]
35    AlreadyExists {
36        name: String,
37        path: String,
38        source: BoxError,
39    },
40
41    #[error("Serialization error: {source:?}")]
42    Serialization { name: String, source: BoxError },
43}
44
45impl From<object_store::Error> for DBError {
46    fn from(err: object_store::Error) -> Self {
47        match err {
48            object_store::Error::NotFound { path, source } => DBError::NotFound {
49                name: "unknown".to_string(),
50                path,
51                source,
52            },
53            object_store::Error::AlreadyExists { path, source } => DBError::AlreadyExists {
54                name: "unknown".to_string(),
55                path,
56                source,
57            },
58            err => DBError::Storage {
59                name: "unknown".to_string(),
60                source: err.into(),
61            },
62        }
63    }
64}
65
66impl From<SchemaError> for DBError {
67    fn from(err: SchemaError) -> Self {
68        DBError::Schema {
69            name: "unknown".to_string(),
70            source: err.into(),
71        }
72    }
73}
74
75impl From<BTreeError> for DBError {
76    fn from(err: BTreeError) -> Self {
77        match &err {
78            BTreeError::Generic { name, .. } => DBError::Index {
79                name: name.clone(),
80                source: err.into(),
81            },
82            BTreeError::Serialization { name, .. } => DBError::Index {
83                name: name.clone(),
84                source: err.into(),
85            },
86            BTreeError::NotFound { name, .. } => DBError::Index {
87                name: name.clone(),
88                source: err.into(),
89            },
90            BTreeError::AlreadyExists { name, .. } => DBError::Index {
91                name: name.clone(),
92                source: err.into(),
93            },
94        }
95    }
96}
97
98impl From<HnswError> for DBError {
99    fn from(err: HnswError) -> Self {
100        match &err {
101            HnswError::Generic { name, .. } => DBError::Index {
102                name: name.clone(),
103                source: err.into(),
104            },
105            HnswError::Serialization { name, .. } => DBError::Index {
106                name: name.clone(),
107                source: err.into(),
108            },
109            HnswError::NotFound { name, .. } => DBError::Index {
110                name: name.clone(),
111                source: err.into(),
112            },
113            HnswError::AlreadyExists { name, .. } => DBError::Index {
114                name: name.clone(),
115                source: err.into(),
116            },
117            HnswError::DimensionMismatch { name, .. } => DBError::Index {
118                name: name.clone(),
119                source: err.into(),
120            },
121        }
122    }
123}
124
125impl From<BM25Error> for DBError {
126    fn from(err: BM25Error) -> Self {
127        match &err {
128            BM25Error::Generic { name, .. } => DBError::Index {
129                name: name.clone(),
130                source: err.into(),
131            },
132            BM25Error::Serialization { name, .. } => DBError::Index {
133                name: name.clone(),
134                source: err.into(),
135            },
136            BM25Error::NotFound { name, .. } => DBError::Index {
137                name: name.clone(),
138                source: err.into(),
139            },
140            BM25Error::AlreadyExists { name, .. } => DBError::Index {
141                name: name.clone(),
142                source: err.into(),
143            },
144            BM25Error::TokenizeFailed { name, .. } => DBError::Index {
145                name: name.clone(),
146                source: err.into(),
147            },
148        }
149    }
150}