velesdb_core/
error.rs

1//! Error types for `VelesDB`.
2//!
3//! This module provides a unified error type for all `VelesDB` operations,
4//! designed for professional API exposure to Python/Node clients.
5
6use thiserror::Error;
7
8/// Result type alias for `VelesDB` operations.
9pub type Result<T> = std::result::Result<T, Error>;
10
11/// Errors that can occur in `VelesDB` operations.
12///
13/// Each variant includes a descriptive error message suitable for end-users.
14/// Error codes follow the pattern `VELES-XXX` for easy debugging.
15#[derive(Error, Debug)]
16pub enum Error {
17    /// Collection already exists (VELES-001).
18    #[error("[VELES-001] Collection '{0}' already exists")]
19    CollectionExists(String),
20
21    /// Collection not found (VELES-002).
22    #[error("[VELES-002] Collection '{0}' not found")]
23    CollectionNotFound(String),
24
25    /// Point not found (VELES-003).
26    #[error("[VELES-003] Point with ID '{0}' not found")]
27    PointNotFound(u64),
28
29    /// Dimension mismatch (VELES-004).
30    #[error("[VELES-004] Vector dimension mismatch: expected {expected}, got {actual}")]
31    DimensionMismatch {
32        /// Expected dimension.
33        expected: usize,
34        /// Actual dimension.
35        actual: usize,
36    },
37
38    /// Invalid vector (VELES-005).
39    #[error("[VELES-005] Invalid vector: {0}")]
40    InvalidVector(String),
41
42    /// Storage error (VELES-006).
43    #[error("[VELES-006] Storage error: {0}")]
44    Storage(String),
45
46    /// Index error (VELES-007).
47    #[error("[VELES-007] Index error: {0}")]
48    Index(String),
49
50    /// Index corrupted (VELES-008).
51    ///
52    /// Indicates that index files are corrupted and need to be rebuilt.
53    #[error("[VELES-008] Index corrupted: {0}")]
54    IndexCorrupted(String),
55
56    /// Configuration error (VELES-009).
57    #[error("[VELES-009] Configuration error: {0}")]
58    Config(String),
59
60    /// Query parsing error (VELES-010).
61    ///
62    /// Wraps `VelesQL` parse errors with position and context information.
63    #[error("[VELES-010] Query error: {0}")]
64    Query(String),
65
66    /// IO error (VELES-011).
67    #[error("[VELES-011] IO error: {0}")]
68    Io(#[from] std::io::Error),
69
70    /// Serialization error (VELES-012).
71    #[error("[VELES-012] Serialization error: {0}")]
72    Serialization(String),
73
74    /// Internal error (VELES-013).
75    ///
76    /// Indicates an unexpected internal error. Please report if encountered.
77    #[error("[VELES-013] Internal error: {0}")]
78    Internal(String),
79
80    /// Vector not allowed on metadata-only collection (VELES-014).
81    #[error("[VELES-014] Vector not allowed on metadata-only collection '{0}'")]
82    VectorNotAllowed(String),
83
84    /// Search not supported on metadata-only collection (VELES-015).
85    #[error("[VELES-015] Vector search not supported on metadata-only collection '{0}'. Use query() instead.")]
86    SearchNotSupported(String),
87
88    /// Vector required for vector collection (VELES-016).
89    #[error("[VELES-016] Vector required for collection '{0}' (not metadata-only)")]
90    VectorRequired(String),
91}
92
93impl Error {
94    /// Returns the error code (e.g., "VELES-001").
95    #[must_use]
96    pub const fn code(&self) -> &'static str {
97        match self {
98            Self::CollectionExists(_) => "VELES-001",
99            Self::CollectionNotFound(_) => "VELES-002",
100            Self::PointNotFound(_) => "VELES-003",
101            Self::DimensionMismatch { .. } => "VELES-004",
102            Self::InvalidVector(_) => "VELES-005",
103            Self::Storage(_) => "VELES-006",
104            Self::Index(_) => "VELES-007",
105            Self::IndexCorrupted(_) => "VELES-008",
106            Self::Config(_) => "VELES-009",
107            Self::Query(_) => "VELES-010",
108            Self::Io(_) => "VELES-011",
109            Self::Serialization(_) => "VELES-012",
110            Self::Internal(_) => "VELES-013",
111            Self::VectorNotAllowed(_) => "VELES-014",
112            Self::SearchNotSupported(_) => "VELES-015",
113            Self::VectorRequired(_) => "VELES-016",
114        }
115    }
116
117    /// Returns true if this error is recoverable.
118    ///
119    /// Non-recoverable errors include corruption and internal errors.
120    #[must_use]
121    pub const fn is_recoverable(&self) -> bool {
122        !matches!(self, Self::IndexCorrupted(_) | Self::Internal(_))
123    }
124}
125
126/// Conversion from `VelesQL` `ParseError`.
127impl From<crate::velesql::ParseError> for Error {
128    fn from(err: crate::velesql::ParseError) -> Self {
129        Self::Query(err.to_string())
130    }
131}