#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SwitchVerifyPlan {
RequireClean,
Skip,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SwitchPlan {
pub verify: SwitchVerifyPlan,
pub target_is_head_alias: bool,
pub success_message: String,
}
impl SwitchPlan {
pub fn plan(force: bool, target: &str, target_short: &str) -> Self {
Self {
verify: if force {
SwitchVerifyPlan::Skip
} else {
SwitchVerifyPlan::RequireClean
},
target_is_head_alias: is_head_alias(target),
success_message: format!("Now at: {target_short}"),
}
}
}
pub fn plan_switch_worktree_verify(force: bool) -> SwitchVerifyPlan {
SwitchPlan::plan(force, "", "").verify
}
pub fn is_head_alias(target: &str) -> bool {
matches!(target, "HEAD" | "@")
}
pub fn switch_success_message(target_short: &str) -> String {
SwitchPlan::plan(false, "", target_short).success_message
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn head_aliases() {
assert!(is_head_alias("HEAD"));
assert!(is_head_alias("@"));
assert!(!is_head_alias("head"));
assert!(!is_head_alias("main"));
assert!(!is_head_alias(""));
}
#[test]
fn verify_plan_from_force() {
assert_eq!(
plan_switch_worktree_verify(false),
SwitchVerifyPlan::RequireClean
);
assert_eq!(plan_switch_worktree_verify(true), SwitchVerifyPlan::Skip);
}
#[test]
fn success_message() {
assert_eq!(switch_success_message("abc1234"), "Now at: abc1234");
let p = SwitchPlan::plan(true, "HEAD", "abc1234");
assert_eq!(p.verify, SwitchVerifyPlan::Skip);
assert!(p.target_is_head_alias);
assert_eq!(p.success_message, "Now at: abc1234");
}
}