Skip to main content

cel_memory_duckdb/
error.rs

1//! Storage-side error type. Converted to [`MemoryError`] on the way out
2//! of the [`DuckdbMemoryProvider`](crate::DuckdbMemoryProvider).
3
4use cel_memory::MemoryError;
5use thiserror::Error;
6
7/// Errors that originate inside the DuckDB memory backend.
8#[derive(Debug, Error)]
9pub enum DuckdbMemoryError {
10    /// duckdb returned an error.
11    #[error("duckdb error: {0}")]
12    Duckdb(#[from] duckdb::Error),
13
14    /// Migration failed to apply.
15    #[error("migration failed ({name}): {source}")]
16    Migration {
17        /// Migration file name.
18        name: String,
19        /// Underlying DuckDB error.
20        source: duckdb::Error,
21    },
22
23    /// The embedder dimension does not match the schema (`FLOAT[384]`).
24    #[error("embedding dim mismatch: provider expects {expected}, embedder declares {actual}")]
25    DimMismatch {
26        /// Dim the schema expects.
27        expected: usize,
28        /// Dim the embedder declares.
29        actual: usize,
30    },
31
32    /// A blocking task failed to join.
33    #[error("blocking task join failed: {0}")]
34    BlockingJoin(String),
35
36    /// JSON serialization failed inside the storage layer.
37    #[error("json error: {0}")]
38    Json(#[from] serde_json::Error),
39}
40
41impl From<DuckdbMemoryError> for MemoryError {
42    fn from(e: DuckdbMemoryError) -> Self {
43        match e {
44            DuckdbMemoryError::DimMismatch { expected, actual } => MemoryError::InvalidArgument(
45                format!("embedding dim mismatch: expected {expected}, got {actual}"),
46            ),
47            DuckdbMemoryError::Json(err) => MemoryError::Storage(format!("json: {err}")),
48            other => MemoryError::Storage(other.to_string()),
49        }
50    }
51}