pub fn ensure(condition: bool, message: &str) -> Result<(), String> {
if condition {
Ok(())
} else {
Err(message.to_string())
}
}
pub fn ensure_fmt<F>(condition: bool, message: F) -> Result<(), String>
where
F: FnOnce() -> String,
{
if condition {
Ok(())
} else {
Err(message())
}
}
pub fn ensure_range<T>(value: T, min: T, max: T, name: &str) -> Result<(), String>
where
T: PartialOrd + std::fmt::Display,
{
if value < min || value > max {
Err(format!(
"{name} must be between {min} and {max}, got {value}"
))
} else {
Ok(())
}
}
pub fn ensure_not_empty<T>(value: &[T], name: &str) -> Result<(), String> {
if value.is_empty() {
Err(format!("{name} must not be empty"))
} else {
Ok(())
}
}
pub fn ensure_some<T>(value: Option<T>, name: &str) -> Result<T, String> {
value.ok_or_else(|| format!("{name} must be set"))
}