refactor(link): add LinkError and propagate errors up to runner #14
1 changed files with 14 additions and 6 deletions
20
src/git.rs
20
src/git.rs
|
@ -123,13 +123,14 @@ pub struct SeriesItem<'series> {
|
||||||
pub closure: Box<dyn Fn(&Repo) -> (bool)>,
|
pub closure: Box<dyn Fn(&Repo) -> (bool)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug)]
|
||||||
pub enum LinkError {
|
pub enum LinkError {
|
||||||
AlreadyLinked(String, String),
|
AlreadyLinked(String, String),
|
||||||
DifferentLink(String, String),
|
DifferentLink(String, String),
|
||||||
FileExists(String, String),
|
FileExists(String, String),
|
||||||
BrokenSymlinkExists(String, String),
|
BrokenSymlinkExists(String, String),
|
||||||
FailedCreatingLink(String, String),
|
FailedCreatingLink(String, String),
|
||||||
|
IoError(std::io::Error),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::fmt::Display for LinkError {
|
impl std::fmt::Display for LinkError {
|
||||||
|
@ -147,6 +148,7 @@ impl std::fmt::Display for LinkError {
|
||||||
write!(f, "Linking {tx} -> {rx} failed: broken symlink")
|
write!(f, "Linking {tx} -> {rx} failed: broken symlink")
|
||||||
}
|
}
|
||||||
LinkError::FailedCreatingLink(tx, rx) => write!(f, "Linking {tx} -> {rx} failed"),
|
LinkError::FailedCreatingLink(tx, rx) => write!(f, "Linking {tx} -> {rx} failed"),
|
||||||
|
LinkError::IoError(err) => write!(f, "IO Error: {err}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -162,6 +164,12 @@ impl std::error::Error for LinkError {
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<std::io::Error> for LinkError {
|
||||||
|
fn from(err: std::io::Error) -> LinkError {
|
||||||
|
LinkError::IoError(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn handle_file_exists(selff: &Link, tx_path: &Path, rx_path: &Path) -> Result<bool, LinkError> {
|
fn handle_file_exists(selff: &Link, tx_path: &Path, rx_path: &Path) -> Result<bool, LinkError> {
|
||||||
match rx_path.read_link() {
|
match rx_path.read_link() {
|
||||||
Ok(file)
|
Ok(file)
|
||||||
|
@ -216,11 +224,8 @@ impl Link {
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
Ok(false) => {
|
Ok(false) => {
|
||||||
symlink(&self.tx, &self.rx).expect("failed to create link");
|
symlink(&self.tx, &self.rx)?;
|
||||||
Err(LinkError::FailedCreatingLink(
|
Ok(true)
|
||||||
tx_path.to_string_lossy().to_string(),
|
|
||||||
rx_path.to_string_lossy().to_string(),
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
Err(error) => {
|
Err(error) => {
|
||||||
error!("Linking {} -> {} failed: {}", &self.tx, &self.rx, error);
|
error!("Linking {} -> {} failed: {}", &self.tx, &self.rx, error);
|
||||||
|
@ -634,6 +639,9 @@ impl Config {
|
||||||
Err(e @ LinkError::FailedCreatingLink(_, _)) => {
|
Err(e @ LinkError::FailedCreatingLink(_, _)) => {
|
||||||
sp.stop_and_persist(failure_str(), format!("{e}"))
|
sp.stop_and_persist(failure_str(), format!("{e}"))
|
||||||
}
|
}
|
||||||
|
Err(e @ LinkError::IoError(_)) => {
|
||||||
|
sp.stop_and_persist(failure_str(), format!("{e}"))
|
||||||
|
}
|
||||||
Err(e) => sp.stop_and_persist(failure_str(), format!("{e}")),
|
Err(e) => sp.stop_and_persist(failure_str(), format!("{e}")),
|
||||||
_ => sp.stop_and_persist(
|
_ => sp.stop_and_persist(
|
||||||
failure_str(),
|
failure_str(),
|
||||||
|
|
Loading…
Reference in a new issue