1use std::path::PathBuf;
2
3use thiserror::Error;
4
5#[derive(Debug, Error)]
6pub enum XurlError {
7 #[error("invalid uri: {0}")]
8 InvalidUri(String),
9
10 #[error("unsupported scheme: {0}")]
11 UnsupportedScheme(String),
12
13 #[error("invalid session id: {0}")]
14 InvalidSessionId(String),
15
16 #[error("invalid mode: {0}")]
17 InvalidMode(String),
18
19 #[error("provider does not support subagent queries: {0}")]
20 UnsupportedSubagentProvider(String),
21
22 #[error("provider does not support write mode: {0}")]
23 UnsupportedProviderWrite(String),
24
25 #[error("command not found: {command}")]
26 CommandNotFound { command: String },
27
28 #[error("command failed: {command} (exit code: {code:?}): {stderr}")]
29 CommandFailed {
30 command: String,
31 code: Option<i32>,
32 stderr: String,
33 },
34
35 #[error("write protocol error: {0}")]
36 WriteProtocol(String),
37
38 #[error("serialization error: {0}")]
39 Serialization(String),
40
41 #[error("cannot determine home directory")]
42 HomeDirectoryNotFound,
43
44 #[error("thread not found for provider={provider} session_id={session_id}")]
45 ThreadNotFound {
46 provider: String,
47 session_id: String,
48 searched_roots: Vec<PathBuf>,
49 },
50
51 #[error("entry not found for provider={provider} session_id={session_id} entry_id={entry_id}")]
52 EntryNotFound {
53 provider: String,
54 session_id: String,
55 entry_id: String,
56 },
57
58 #[error("thread file is empty: {path}")]
59 EmptyThreadFile { path: PathBuf },
60
61 #[error("thread file is not valid UTF-8: {path}")]
62 NonUtf8ThreadFile { path: PathBuf },
63
64 #[error("i/o error on {path}: {source}")]
65 Io {
66 path: PathBuf,
67 #[source]
68 source: std::io::Error,
69 },
70
71 #[error("sqlite error on {path}: {source}")]
72 Sqlite {
73 path: PathBuf,
74 #[source]
75 source: rusqlite::Error,
76 },
77
78 #[error("invalid json line in {path} at line {line}: {source}")]
79 InvalidJsonLine {
80 path: PathBuf,
81 line: usize,
82 #[source]
83 source: serde_json::Error,
84 },
85}
86
87pub type Result<T> = std::result::Result<T, XurlError>;