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>;