1use 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#[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}