cel-memory-duckdb 0.1.0

DuckDB embedded memory backend for AI agents, implementing cel-memory.
Documentation
//! Storage-side error type. Converted to [`MemoryError`] on the way out
//! of the [`DuckdbMemoryProvider`](crate::DuckdbMemoryProvider).

use cel_memory::MemoryError;
use thiserror::Error;

/// Errors that originate inside the DuckDB memory backend.
#[derive(Debug, Error)]
pub enum DuckdbMemoryError {
    /// duckdb returned an error.
    #[error("duckdb error: {0}")]
    Duckdb(#[from] duckdb::Error),

    /// Migration failed to apply.
    #[error("migration failed ({name}): {source}")]
    Migration {
        /// Migration file name.
        name: String,
        /// Underlying DuckDB error.
        source: duckdb::Error,
    },

    /// The embedder dimension does not match the schema (`FLOAT[384]`).
    #[error("embedding dim mismatch: provider expects {expected}, embedder declares {actual}")]
    DimMismatch {
        /// Dim the schema expects.
        expected: usize,
        /// Dim the embedder declares.
        actual: usize,
    },

    /// A blocking task failed to join.
    #[error("blocking task join failed: {0}")]
    BlockingJoin(String),

    /// JSON serialization failed inside the storage layer.
    #[error("json error: {0}")]
    Json(#[from] serde_json::Error),
}

impl From<DuckdbMemoryError> for MemoryError {
    fn from(e: DuckdbMemoryError) -> Self {
        match e {
            DuckdbMemoryError::DimMismatch { expected, actual } => MemoryError::InvalidArgument(
                format!("embedding dim mismatch: expected {expected}, got {actual}"),
            ),
            DuckdbMemoryError::Json(err) => MemoryError::Storage(format!("json: {err}")),
            other => MemoryError::Storage(other.to_string()),
        }
    }
}