1use std::io;
2use std::path::PathBuf;
3
4use thiserror::Error;
5
6#[derive(Debug, Error)]
7pub enum Error {
8 #[error("source not found: {path}")]
9 SourceNotFound { path: PathBuf },
10
11 #[error("destination already exists: {path}")]
12 DestExists { path: PathBuf },
13
14 #[error("operation cancelled")]
15 Cancelled,
16
17 #[error("insufficient disk space: needed {needed} bytes, available {available} bytes")]
18 NoSpace { needed: u64, available: u64 },
19
20 #[error("permission denied: {path}")]
21 PermissionDenied { path: PathBuf },
22
23 #[error("io error on {path}: {source}")]
24 Io { path: PathBuf, source: io::Error },
25
26 #[cfg(feature = "compress")]
27 #[error("could not infer compression format from destination: {path}")]
28 UnknownCompressFormat { path: PathBuf },
29
30 #[cfg(feature = "compress")]
31 #[error("gzip compression requires a single file, got a directory: {path}")]
32 GzipRequiresFile { path: PathBuf },
33
34 #[cfg(feature = "operations")]
40 #[error("filename differs only by case from another entry, which the destination filesystem cannot represent: {path} collides with {other}")]
41 CaseCollision { path: PathBuf, other: PathBuf },
42
43 #[cfg(feature = "operations")]
44 #[error("file exceeds the destination filesystem's maximum file size: {path} ({size} bytes, max {max} bytes)")]
45 FileTooLargeForDest { path: PathBuf, size: u64, max: u64 },
46
47 #[cfg(feature = "operations")]
48 #[error("filename is reserved or invalid on the destination filesystem: {path}")]
49 ReservedName { path: PathBuf },
50
51 #[cfg(feature = "operations")]
56 #[error("destination filesystem ({filesystem}) has a known write-integrity issue on this platform")]
57 FilesystemIntegrityRisk { filesystem: String },
58}
59
60impl Error {
61 #[cfg(feature = "operations")]
73 pub(crate) fn is_fatal(&self) -> bool {
74 matches!(self, Error::Cancelled | Error::NoSpace { .. } | Error::FilesystemIntegrityRisk { .. })
75 }
76}
77
78pub type Result<T> = std::result::Result<T, Error>;