use std::io;
use std::path::PathBuf;
use crate::error::Error;
pub(crate) fn classify_io_error(err: io::Error, path: PathBuf) -> Error {
match err.kind() {
io::ErrorKind::NotFound => Error::SourceNotFound { path },
io::ErrorKind::PermissionDenied => Error::PermissionDenied { path },
_ => Error::Io { path, source: err },
}
}
pub(crate) fn classify_walkdir_error(err: walkdir::Error) -> Error {
let path = err.path().map(|p| p.to_path_buf());
match err.into_io_error() {
Some(io_err) => classify_io_error(io_err, path.unwrap_or_default()),
None => Error::Io {
path: path.unwrap_or_default(),
source: io::Error::other("directory walk error"),
},
}
}
#[cfg(feature = "checksum")]
pub(crate) fn default_concurrency() -> usize {
std::thread::available_parallelism()
.map(|n| n.get())
.unwrap_or(1)
}