1crate::ix!();
3
4error_tree!{
5
6 #[derive(Clone)]
7 pub enum CargoTomlWriteError {
8 WriteWorkspaceHeaderError {
9 io: Arc<io::Error>,
10 },
11 OpenWorkspaceMembersFieldError {
12 io: Arc<io::Error>,
13 },
14 WritePackageSectionError {
15 io: Arc<io::Error>,
16 },
17 WriteWorkspaceMember {
18 io: Arc<io::Error>,
19 },
20 CloseWorkspaceMembersFieldError {
21 io: Arc<io::Error>,
22 },
23 WriteError {
24 io: Arc<io::Error>,
25 cargo_toml_file: PathBuf,
26 },
27 }
28
29 #[derive(Clone)]
30 pub enum CargoTomlError {
31 ReadError {
32 io: Arc<io::Error>,
33 },
34 CargoTomlWriteError(CargoTomlWriteError),
35 MissingRequiredFieldForPublishing {
36 cargo_toml_file: PathBuf,
37 field: String,
38 },
39 MissingRequiredFieldForIntegrity {
40 cargo_toml_file: PathBuf,
41 field: String,
42 },
43 InvalidVersionFormat {
44 cargo_toml_file: PathBuf,
45 version: String,
46 },
47 MissingPackageSection {
48 cargo_toml_file: PathBuf,
49 },
50 TomlParseError {
51 cargo_toml_file: PathBuf,
52 toml_parse_error: toml::de::Error,
53 },
54 TomlEditError {
55 cargo_toml_file: PathBuf,
56 toml_parse_error: toml_edit::TomlError,
57 },
58
59 FileNotFound {
61 missing_file: PathBuf,
62 },
63
64 FileIsNotAFile {
65 invalid_path: PathBuf,
66 },
67 }
68
69 #[derive(Clone)]
70 pub enum TestFailure {
71 UnknownError {
72 stdout: Option<String>,
73 stderr: Option<String>,
74 }
75 }
76
77 #[derive(Clone)]
78 pub enum TokioError {
79 JoinError {
80 join_error: Arc<tokio::task::JoinError>,
81 },
82 }
83
84 #[derive(Clone)]
85 pub enum DirectoryError {
86 CreateDirAllError {
87 io: Arc<io::Error>,
88 },
89 ReadDirError {
90 io: Arc<io::Error>,
91 },
92 GetNextEntryError {
93 io: Arc<io::Error>,
94 },
95 }
96
97 #[derive(Clone)]
98 pub enum ReadmeWriteError {
99 WriteBlankReadmeError {
100 io: Arc<io::Error>,
101 },
102 }
103
104 #[derive(Clone)]
105 pub enum CrateWriteError {
106 ReadmeWriteError(ReadmeWriteError),
107 WriteDummyMainError {
108 io: Arc<io::Error>,
109 },
110 WriteDummyTestError {
111 io: Arc<io::Error>,
112 },
113 WriteLibRsFileError {
114 io: Arc<io::Error>,
115 },
116 WriteMainFnError {
117 io: Arc<io::Error>,
118 },
119 }
120
121 #[derive(Clone)]
122 pub enum TestCoverageError {
123 TestFailure {
124 stdout: Option<String>,
125 stderr: Option<String>,
126 },
127 UnknownError {
128 stdout: Option<String>,
129 stderr: Option<String>,
130 },
131 CoverageParseError,
132 CommandError {
133 io: Arc<io::Error>,
134 },
135 }
136
137 #[derive(Clone)]
138 pub enum CargoDocError {
139 CommandError {
140 io: Arc<io::Error>,
141 },
142 UnknownError {
143 stdout: Option<String>,
144 stderr: Option<String>,
145 }
146 }
147
148 #[derive(Clone)]
149 pub enum LintingError {
150 CommandError {
151 io: Arc<io::Error>,
152 },
153 UnknownError {
154 stdout: Option<String>,
155 stderr: Option<String>,
156 }
157 }
158
159 #[derive(Clone)]
160 pub enum CargoMetadataError {
161 MetadataError {
162 error: Arc<cargo_metadata::Error>,
163 },
164 CircularDependency,
165 CyclicPackageDependency,
166 }
167
168 #[derive(Clone)]
169 pub enum BuildError {
170 CommandError {
171 io: Arc<io::Error>,
172 },
173 BuildFailed {
174 stderr: String,
175 },
176 }
177}
178
179error_tree!{
180
181 #[derive(Clone)]
182 pub enum CrateError {
183 FileNotFound {
185 missing_file: PathBuf,
186 },
187
188 DirectoryNotFound {
190 missing_directory: PathBuf,
191 },
192
193 FailedToGetFileNameForPath {
194 path: PathBuf,
195 },
196
197 DirectoryError(DirectoryError),
198 CargoTomlError(CargoTomlError),
199
200 IoError {
201 io_error: Arc<io::Error>,
202 },
203 }
204}
205
206error_tree!{
207
208 #[derive(Clone)]
209 pub enum WatchError {
210 NotifyError(Arc<notify::Error>),
211 IoError {
212 io: Arc<io::Error>,
213 },
214 ChannelRecvError(std::sync::mpsc::RecvError),
215 }
216
217 #[derive(Clone)]
219 pub enum WorkspaceError {
220 CrateError(CrateError),
221 CratePinFailed {
222 crate_path: PathBuf,
223 source: Box<CrateError>,
224 },
225
226 TokioJoinError {
227 join_error: Arc<tokio::task::JoinError>,
228 },
229 IoError {
230 io_error: Arc<io::Error>,
231 context: String,
232 },
233 InvalidLockfile {
234 path: PathBuf,
235 message: String,
236 },
237
238 FileNotFound {
240 missing_file: PathBuf,
241 },
242
243 InvalidWorkspace {
244 invalid_workspace_path: PathBuf,
245 },
246
247 CargoDocError(CargoDocError),
248 CrateWriteError(CrateWriteError),
249 ReadmeWriteError(ReadmeWriteError),
250 TokioError(TokioError),
251 CargoMetadataError(CargoMetadataError),
252 CircularDependency {
253 detected_cycles: Vec<Vec<String>>,
255 },
256 CoverageParseError,
257 DirectoryRemovalError,
258 FileRemovalError,
259 InvalidCargoToml(CargoTomlError),
260 CargoTomlWriteError(CargoTomlWriteError),
261 LintingError(LintingError),
262 MultipleErrors(Vec<WorkspaceError>),
263 TestCoverageError(TestCoverageError),
264 TestFailure(TestFailure),
265 WatchError(WatchError),
266 BuildError(BuildError),
267 FileError(FileError),
268 DirectoryError(DirectoryError),
269 WorkspaceNotReadyForCargoPublish,
270 FileWatchError,
271 TestTimeout,
272 }
273}
274
275impl From<tokio::task::JoinError> for WorkspaceError {
276 fn from(join_error: tokio::task::JoinError) -> Self {
277 WorkspaceError::TokioJoinError {
278 join_error: Arc::new(join_error),
279 }
280 }
281}
282
283impl From<io::Error> for WorkspaceError {
284 fn from(io_error: io::Error) -> Self {
285 WorkspaceError::IoError {
286 io_error: Arc::new(io_error),
287 context: "no explicit context".to_string()
288 }
289 }
290}
291
292impl fmt::Display for WorkspaceError {
293 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
294 write!(f, "{:#?}", self)
295 }
296}
297
298impl CargoMetadataError {
299
300 pub fn is_cyclic_package_dependency_error(&self) -> bool {
301 self.to_string().contains("cyclic package dependency")
302 }
303}
304
305impl fmt::Display for CargoMetadataError {
306 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
307 write!(f, "{:#?}", self)
308 }
309}