#![allow(dead_code)]
use crate::Error;
pub fn require<T>(value: Option<T>, error_message: &str) -> Result<T, Error> {
value.ok_or_else(|| Error::InvalidArgument(error_message.to_string()))
}
pub fn require_with<T, F>(value: Option<T>, error_fn: F) -> Result<T, Error>
where
F: FnOnce() -> String,
{
value.ok_or_else(|| Error::InvalidArgument(error_fn()))
}
pub fn require_request_id(id: Option<i32>) -> Result<i32, Error> {
require(id, "Request ID required")
}
pub fn require_request_id_for(id: Option<i32>, operation: &str) -> Result<i32, Error> {
require_with(id, || format!("Request ID required to {}", operation))
}
pub fn require_range<T>(value: T, min: T, max: T, name: &str) -> Result<T, Error>
where
T: PartialOrd + std::fmt::Display,
{
if value < min || value > max {
Err(Error::InvalidArgument(format!(
"{} must be between {} and {}, got {}",
name, min, max, value
)))
} else {
Ok(value)
}
}
pub fn require_not_empty<'a>(value: &'a str, name: &str) -> Result<&'a str, Error> {
if value.is_empty() {
Err(Error::InvalidArgument(format!("{} cannot be empty", name)))
} else {
Ok(value)
}
}
pub fn require_not_empty_vec<'a, T>(value: &'a [T], name: &str) -> Result<&'a [T], Error> {
if value.is_empty() {
Err(Error::InvalidArgument(format!("{} must contain at least one element", name)))
} else {
Ok(value)
}
}
pub fn map_error<T, E>(result: Result<T, E>, error_message: &str) -> Result<T, Error>
where
E: std::fmt::Display,
{
result.map_err(|e| Error::InvalidArgument(format!("{}: {}", error_message, e)))
}
pub fn map_error_with<T, E, F>(result: Result<T, E>, error_fn: F) -> Result<T, Error>
where
E: std::fmt::Display,
F: FnOnce(&E) -> String,
{
result.map_err(|e| Error::InvalidArgument(error_fn(&e)))
}
#[cfg(test)]
#[path = "error_helpers_tests.rs"]
mod tests;