use crate::utils::aliases::StrMap;
use crate::utils::trad::tf;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum FormDataError {
Invalid(String),
Required(String),
Password(String),
}
impl std::fmt::Display for FormDataError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let message = match self {
Self::Invalid(field) => tf("forms.data_invalid", &[field]),
Self::Required(field) => tf("forms.data_required", &[field]),
Self::Password(field) => tf("forms.data_password", &[field]),
};
f.write_str(&message)
}
}
impl std::error::Error for FormDataError {}
impl From<FormDataError> for sea_orm::DbErr {
fn from(e: FormDataError) -> Self {
sea_orm::DbErr::Custom(e.to_string())
}
}
pub fn read<T>(
data: &StrMap,
name: &str,
parse: impl FnOnce(&str) -> Option<T>,
) -> Result<Option<T>, FormDataError> {
match data.get(name).map(|v| v.trim()).filter(|v| !v.is_empty()) {
None => Ok(None),
Some(v) => parse(v)
.map(Some)
.ok_or_else(|| FormDataError::Invalid(name.to_string())),
}
}
pub fn required<T>(value: Option<T>, name: &str) -> Result<T, FormDataError> {
value.ok_or_else(|| FormDataError::Required(name.to_string()))
}
pub fn password(value: &str, name: &str) -> Result<String, FormDataError> {
let service =
crate::utils::password::PasswordService::new(crate::utils::password::password_get());
if service.is_already_hashed(value) {
return Ok(value.to_string());
}
crate::utils::password::hash(value).map_err(|_| FormDataError::Password(name.to_string()))
}