1use thiserror::Error;
7
8pub type Result<T> = std::result::Result<T, Error>;
10
11#[derive(Error, Debug)]
16pub enum Error {
17 #[error("[VELES-001] Collection '{0}' already exists")]
19 CollectionExists(String),
20
21 #[error("[VELES-002] Collection '{0}' not found")]
23 CollectionNotFound(String),
24
25 #[error("[VELES-003] Point with ID '{0}' not found")]
27 PointNotFound(u64),
28
29 #[error("[VELES-004] Vector dimension mismatch: expected {expected}, got {actual}")]
31 DimensionMismatch {
32 expected: usize,
34 actual: usize,
36 },
37
38 #[error("[VELES-005] Invalid vector: {0}")]
40 InvalidVector(String),
41
42 #[error("[VELES-006] Storage error: {0}")]
44 Storage(String),
45
46 #[error("[VELES-007] Index error: {0}")]
48 Index(String),
49
50 #[error("[VELES-008] Index corrupted: {0}")]
54 IndexCorrupted(String),
55
56 #[error("[VELES-009] Configuration error: {0}")]
58 Config(String),
59
60 #[error("[VELES-010] Query error: {0}")]
64 Query(String),
65
66 #[error("[VELES-011] IO error: {0}")]
68 Io(#[from] std::io::Error),
69
70 #[error("[VELES-012] Serialization error: {0}")]
72 Serialization(String),
73
74 #[error("[VELES-013] Internal error: {0}")]
78 Internal(String),
79
80 #[error("[VELES-014] Vector not allowed on metadata-only collection '{0}'")]
82 VectorNotAllowed(String),
83
84 #[error("[VELES-015] Vector search not supported on metadata-only collection '{0}'. Use query() instead.")]
86 SearchNotSupported(String),
87
88 #[error("[VELES-016] Vector required for collection '{0}' (not metadata-only)")]
90 VectorRequired(String),
91}
92
93impl Error {
94 #[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 #[must_use]
121 pub const fn is_recoverable(&self) -> bool {
122 !matches!(self, Self::IndexCorrupted(_) | Self::Internal(_))
123 }
124}
125
126impl From<crate::velesql::ParseError> for Error {
128 fn from(err: crate::velesql::ParseError) -> Self {
129 Self::Query(err.to_string())
130 }
131}