#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
#[non_exhaustive]
pub enum SymlinkMode {
#[default]
Follow,
FollowUnsafe,
#[cfg(feature = "symlink-move")]
Redirect,
#[cfg(feature = "symlink-move")]
Move,
}
#[cfg(feature = "cli")]
#[derive(clap::ValueEnum, Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum SymlinkModeArg {
#[default]
Follow,
FollowUnsafe,
#[cfg(feature = "symlink-move")]
Redirect,
#[cfg(feature = "symlink-move")]
Move,
}
#[cfg(feature = "cli")]
impl From<SymlinkModeArg> for SymlinkMode {
fn from(arg: SymlinkModeArg) -> Self {
match arg {
SymlinkModeArg::Follow => SymlinkMode::Follow,
SymlinkModeArg::FollowUnsafe => SymlinkMode::FollowUnsafe,
#[cfg(feature = "symlink-move")]
SymlinkModeArg::Redirect => SymlinkMode::Redirect,
#[cfg(feature = "symlink-move")]
SymlinkModeArg::Move => SymlinkMode::Move,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_default_is_the_safe_mode() {
assert_eq!(SymlinkMode::default(), SymlinkMode::Follow);
}
#[cfg(feature = "cli")]
#[test]
fn cli_values_are_kebab_case() {
use clap::ValueEnum;
let names: Vec<_> = SymlinkModeArg::value_variants()
.iter()
.map(|v| v.to_possible_value().unwrap().get_name().to_string())
.collect();
#[cfg(feature = "symlink-move")]
assert_eq!(names, ["follow", "follow-unsafe", "redirect", "move"]);
#[cfg(not(feature = "symlink-move"))]
assert_eq!(names, ["follow", "follow-unsafe"]);
}
}