workspacer_interface/
errors.rs

1// ---------------- [ File: workspacer-interface/src/errors.rs ]
2crate::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        // Error indicating that a file was not found.
60        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        // Error indicating that a file was not found.
184        FileNotFound {
185            missing_file: PathBuf,
186        },
187
188        // Error indicating that a directory was not found.
189        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)]
218    pub enum WorkspaceGitError {
219        FailedToRunGitStatusMakeSureGitIsInstalled,
220        WorkingDirectoryIsNotCleanAborting,
221        IoError {
222            io: Arc<io::Error>,
223        }
224    }
225
226    // Enum representing possible errors in the `workspace-detail` crate.
227    #[derive(Clone)]
228    pub enum WorkspaceError {
229        WorkspaceGitError(WorkspaceGitError),
230        CrateError(CrateError),
231        CratePinFailed {
232            crate_path: PathBuf,
233            source:     Box<CrateError>,
234        },
235
236        TokioJoinError {
237            join_error: Arc<tokio::task::JoinError>,
238        },
239        IoError {
240            io_error: Arc<io::Error>,
241            context:  String,
242        },
243        InvalidLockfile {
244            path:    PathBuf,
245            message: String,
246        },
247
248        // Error indicating that a file was not found.
249        FileNotFound {
250            missing_file: PathBuf,
251        },
252
253        InvalidWorkspace {
254            invalid_workspace_path: PathBuf,
255        },
256
257        CargoDocError(CargoDocError),
258        CrateWriteError(CrateWriteError),
259        ReadmeWriteError(ReadmeWriteError),
260        TokioError(TokioError),
261        CargoMetadataError(CargoMetadataError),
262        CircularDependency {
263            // To store the detected cycles
264            detected_cycles: Vec<Vec<String>>,
265        },  
266        CoverageParseError,
267        DirectoryRemovalError,
268        FileRemovalError,
269        InvalidCargoToml(CargoTomlError),
270        CargoTomlWriteError(CargoTomlWriteError),
271        LintingError(LintingError),
272        MultipleErrors(Vec<WorkspaceError>),
273        TestCoverageError(TestCoverageError),
274        TestFailure(TestFailure),
275        WatchError(WatchError),
276        BuildError(BuildError),
277        FileError(FileError),
278        DirectoryError(DirectoryError),
279        WorkspaceNotReadyForCargoPublish,
280        FileWatchError,
281        TestTimeout,
282    }
283}
284
285impl From<tokio::task::JoinError> for WorkspaceError {
286    fn from(join_error: tokio::task::JoinError) -> Self {
287        WorkspaceError::TokioJoinError {
288            join_error: Arc::new(join_error),
289        }
290    }
291}
292
293impl From<io::Error> for WorkspaceError {
294    fn from(io_error: io::Error) -> Self {
295        WorkspaceError::IoError {
296            io_error: Arc::new(io_error),
297            context: "no explicit context".to_string()
298        }
299    }
300}
301
302impl fmt::Display for WorkspaceError {
303    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
304        write!(f, "{:#?}", self)
305    }
306}
307
308impl CargoMetadataError {
309
310    pub fn is_cyclic_package_dependency_error(&self) -> bool {
311        self.to_string().contains("cyclic package dependency")
312    }
313}
314
315impl fmt::Display for CargoMetadataError {
316    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
317        write!(f, "{:#?}", self)
318    }
319}