Skip to main content

seekr_code/
error.rs

1//! Unified error types for Seekr.
2//!
3//! Uses `thiserror` to define structured error enums for each module,
4//! with a top-level `SeekrError` that aggregates all module errors.
5
6use std::path::PathBuf;
7
8/// Top-level error type for Seekr.
9#[derive(Debug, thiserror::Error)]
10pub enum SeekrError {
11    #[error("Scanner error: {0}")]
12    Scanner(#[from] ScannerError),
13
14    #[error("Parser error: {0}")]
15    Parser(#[from] ParserError),
16
17    #[error("Embedder error: {0}")]
18    Embedder(#[from] EmbedderError),
19
20    #[error("Index error: {0}")]
21    Index(#[from] IndexError),
22
23    #[error("Search error: {0}")]
24    Search(#[from] SearchError),
25
26    #[error("Server error: {0}")]
27    Server(#[from] ServerError),
28
29    #[error("Config error: {0}")]
30    Config(#[from] ConfigError),
31
32    #[error("IO error: {0}")]
33    Io(#[from] std::io::Error),
34}
35
36/// Errors from the file scanner module.
37#[derive(Debug, thiserror::Error)]
38pub enum ScannerError {
39    #[error("Failed to walk directory '{path}': {source}")]
40    WalkError {
41        path: PathBuf,
42        source: std::io::Error,
43    },
44
45    #[error("File filter error: {0}")]
46    FilterError(String),
47
48    #[error("File watcher error: {0}")]
49    WatchError(String),
50}
51
52/// Errors from the code parser module.
53#[derive(Debug, thiserror::Error)]
54pub enum ParserError {
55    #[error("Unsupported language: {0}")]
56    UnsupportedLanguage(String),
57
58    #[error("Failed to parse file '{path}': {reason}")]
59    ParseFailed { path: PathBuf, reason: String },
60
61    #[error("Chunking error: {0}")]
62    ChunkError(String),
63
64    #[error("IO error: {0}")]
65    Io(#[from] std::io::Error),
66}
67
68/// Errors from the embedding engine module.
69#[derive(Debug, thiserror::Error)]
70pub enum EmbedderError {
71    #[error("Model not found at '{0}'")]
72    ModelNotFound(PathBuf),
73
74    #[error("Model download failed: {0}")]
75    DownloadFailed(String),
76
77    #[error("Model checksum mismatch: expected {expected}, got {actual}")]
78    ChecksumMismatch { expected: String, actual: String },
79
80    #[error("ONNX runtime error: {0}")]
81    OnnxError(String),
82
83    #[error("Embedding dimension mismatch: expected {expected}, got {actual}")]
84    DimensionMismatch { expected: usize, actual: usize },
85
86    #[error("IO error: {0}")]
87    Io(#[from] std::io::Error),
88}
89
90/// Errors from the index engine module.
91#[derive(Debug, thiserror::Error)]
92pub enum IndexError {
93    #[error("Index not found at '{0}'")]
94    NotFound(PathBuf),
95
96    #[error("Index version mismatch: file version {file_version}, expected {expected_version}")]
97    VersionMismatch {
98        file_version: u32,
99        expected_version: u32,
100    },
101
102    #[error("Corrupted index: {0}")]
103    Corrupted(String),
104
105    #[error("Serialization error: {0}")]
106    Serialization(String),
107
108    #[error("IO error: {0}")]
109    Io(#[from] std::io::Error),
110}
111
112/// Errors from the search module.
113#[derive(Debug, thiserror::Error)]
114pub enum SearchError {
115    #[error("Invalid regex pattern: {0}")]
116    InvalidRegex(String),
117
118    #[error("Invalid AST pattern: {0}")]
119    InvalidAstPattern(String),
120
121    #[error("Index error: {0}")]
122    Index(#[from] IndexError),
123
124    #[error("Embedder error: {0}")]
125    Embedder(#[from] EmbedderError),
126}
127
128/// Errors from the server module.
129#[derive(Debug, thiserror::Error)]
130pub enum ServerError {
131    #[error("Failed to bind address '{address}': {source}")]
132    BindFailed {
133        address: String,
134        source: std::io::Error,
135    },
136
137    #[error("MCP protocol error: {0}")]
138    McpError(String),
139
140    #[error("Internal error: {0}")]
141    Internal(String),
142}
143
144/// Errors from the configuration module.
145#[derive(Debug, thiserror::Error)]
146pub enum ConfigError {
147    #[error("Config file parse error: {0}")]
148    ParseError(String),
149
150    #[error("Invalid config value for '{key}': {reason}")]
151    InvalidValue { key: String, reason: String },
152
153    #[error("IO error: {0}")]
154    Io(#[from] std::io::Error),
155}
156
157/// Convenience type alias for Seekr results.
158pub type Result<T> = std::result::Result<T, SeekrError>;