1use std::fmt;
2
3#[derive(Debug)]
4pub enum OrgModeError {
5 InvalidDirectory(String),
6 InvalidHeadingPath(String),
7 InvalidElementId(String),
8 WalkDirError(walkdir::Error),
9 IoError(std::io::Error),
10 ShellExpansionError(String),
11 ConfigError(String),
12}
13
14impl fmt::Display for OrgModeError {
15 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
16 match self {
17 OrgModeError::InvalidDirectory(path) => {
18 write!(f, "Invalid or inaccessible directory: {path}")
19 }
20 OrgModeError::InvalidHeadingPath(path) => {
21 write!(f, "Invalid heading path: {path}")
22 }
23 OrgModeError::InvalidElementId(id) => {
24 write!(f, "Invalid element id: {id}")
25 }
26 OrgModeError::WalkDirError(err) => write!(f, "Error walking directory: {err}"),
27 OrgModeError::IoError(err) => write!(f, "IO error: {err}"),
28 OrgModeError::ShellExpansionError(path) => write!(f, "Failed to expand path: {path}"),
29 OrgModeError::ConfigError(msg) => write!(f, "Configuration error: {msg}"),
30 }
31 }
32}
33
34impl std::error::Error for OrgModeError {
35 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
36 match self {
37 OrgModeError::WalkDirError(err) => Some(err),
38 OrgModeError::IoError(err) => Some(err),
39 _ => None,
40 }
41 }
42}
43
44impl From<walkdir::Error> for OrgModeError {
45 fn from(err: walkdir::Error) -> Self {
46 OrgModeError::WalkDirError(err)
47 }
48}
49
50impl From<std::io::Error> for OrgModeError {
51 fn from(err: std::io::Error) -> Self {
52 OrgModeError::IoError(err)
53 }
54}
55
56impl From<config::ConfigError> for OrgModeError {
57 fn from(err: config::ConfigError) -> Self {
58 OrgModeError::ConfigError(err.to_string())
59 }
60}