Skip to main content

chronicle/
error.rs

1use snafu::Snafu;
2use std::path::PathBuf;
3
4#[derive(Debug, Snafu)]
5#[snafu(visibility(pub), module(chronicle_error))]
6pub enum ChronicleError {
7    #[snafu(display("not a git repository: {}", path.display()))]
8    NotARepository {
9        path: PathBuf,
10        #[snafu(implicit)]
11        location: snafu::Location,
12    },
13
14    #[snafu(display("chronicle not initialized (run `git chronicle init` first)"))]
15    NotInitialized {
16        #[snafu(implicit)]
17        location: snafu::Location,
18    },
19
20    #[snafu(display("git error: {source}"))]
21    Git {
22        source: GitError,
23        #[snafu(implicit)]
24        location: snafu::Location,
25    },
26
27    #[snafu(display("config error: {message}"))]
28    Config {
29        message: String,
30        #[snafu(implicit)]
31        location: snafu::Location,
32    },
33
34    #[snafu(display("IO error: {source}"))]
35    Io {
36        source: std::io::Error,
37        #[snafu(implicit)]
38        location: snafu::Location,
39    },
40
41    #[snafu(display("JSON error: {source}"))]
42    Json {
43        source: serde_json::Error,
44        #[snafu(implicit)]
45        location: snafu::Location,
46    },
47
48    #[snafu(display("annotation validation error: {message}"))]
49    Validation {
50        message: String,
51        #[snafu(implicit)]
52        location: snafu::Location,
53    },
54
55    #[snafu(display("setup error: {source}"))]
56    Setup {
57        source: SetupError,
58        #[snafu(implicit)]
59        location: snafu::Location,
60    },
61}
62
63#[derive(Debug, Snafu)]
64#[snafu(visibility(pub), module(git_error))]
65pub enum GitError {
66    #[snafu(display("git command failed: {message}"))]
67    CommandFailed {
68        message: String,
69        #[snafu(implicit)]
70        location: snafu::Location,
71    },
72
73    #[snafu(display("commit not found: {sha}"))]
74    CommitNotFound {
75        sha: String,
76        #[snafu(implicit)]
77        location: snafu::Location,
78    },
79
80    #[snafu(display("file not found: {path} at {commit}"))]
81    FileNotFound {
82        path: String,
83        commit: String,
84        #[snafu(implicit)]
85        location: snafu::Location,
86    },
87
88    #[snafu(display("notes ref missing: {refname}"))]
89    NotesRefMissing {
90        refname: String,
91        #[snafu(implicit)]
92        location: snafu::Location,
93    },
94
95    #[snafu(display("diff parse error: {message}"))]
96    DiffParse {
97        message: String,
98        #[snafu(implicit)]
99        location: snafu::Location,
100    },
101
102    #[snafu(display("IO error: {source}"))]
103    Io {
104        source: std::io::Error,
105        #[snafu(implicit)]
106        location: snafu::Location,
107    },
108}
109
110#[derive(Debug, Snafu)]
111#[snafu(visibility(pub), module(setup_error))]
112pub enum SetupError {
113    #[snafu(display("home directory not found, at {location}"))]
114    NoHomeDirectory {
115        #[snafu(implicit)]
116        location: snafu::Location,
117    },
118
119    #[snafu(display("git-chronicle binary not found on PATH, at {location}"))]
120    BinaryNotFound {
121        #[snafu(implicit)]
122        location: snafu::Location,
123    },
124
125    #[snafu(display("failed to write {path}: {source}, at {location}"))]
126    WriteFile {
127        path: String,
128        #[snafu(source)]
129        source: std::io::Error,
130        #[snafu(implicit)]
131        location: snafu::Location,
132    },
133
134    #[snafu(display("failed to read file {path}: {source}, at {location}"))]
135    ReadFile {
136        path: String,
137        #[snafu(source)]
138        source: std::io::Error,
139        #[snafu(implicit)]
140        location: snafu::Location,
141    },
142
143    #[snafu(display("failed to read user config: {source}, at {location}"))]
144    ReadConfig {
145        #[snafu(source)]
146        source: toml::de::Error,
147        #[snafu(implicit)]
148        location: snafu::Location,
149    },
150
151    #[snafu(display("failed to write user config: {source}, at {location}"))]
152    WriteConfig {
153        #[snafu(source)]
154        source: toml::ser::Error,
155        #[snafu(implicit)]
156        location: snafu::Location,
157    },
158}
159
160pub type Result<T, E = ChronicleError> = std::result::Result<T, E>;