use std::path::{Component, Path};
pub fn inside_the_repo<C>(path: &Path, _: &C) -> garde::Result {
if path.is_absolute()
|| path
.components()
.any(|part| matches!(part, Component::ParentDir))
{
return Err(garde::Error::new("must stay inside the repository"));
}
Ok(())
}
pub fn at_least_one<T, C>(noun: &'static str) -> impl Fn(&[T], &C) -> garde::Result {
move |items, _| {
if items.is_empty() {
return Err(garde::Error::new(format!(
"must declare at least one {noun}"
)));
}
Ok(())
}
}
pub fn cannot_be_empty<C>(because: &'static str) -> impl Fn(&str, &C) -> garde::Result {
move |value, _| {
if value.is_empty() {
return Err(garde::Error::new(format!("cannot be empty — {because}")));
}
Ok(())
}
}
pub fn one_file_name<C>(name: &str, _: &C) -> garde::Result {
let path = Path::new(name);
if path.file_name().is_none_or(|only| only != name) {
return Err(garde::Error::new("must be one file name"));
}
Ok(())
}