mirror of
https://github.com/DefectingCat/phthonus
synced 2025-07-15 16:41:32 +00:00
58 lines
1.4 KiB
Rust
58 lines
1.4 KiB
Rust
use std::sync::LazyLock;
|
|
|
|
use axum::{
|
|
async_trait,
|
|
extract::{
|
|
rejection::{FormRejection, JsonRejection},
|
|
FromRequest, Request,
|
|
},
|
|
Form, Json,
|
|
};
|
|
use regex::Regex;
|
|
use serde::de::DeserializeOwned;
|
|
use validator::Validate;
|
|
|
|
use crate::error::AppError;
|
|
|
|
#[derive(Debug, Clone, Copy, Default)]
|
|
pub struct ValidatedForm<T>(pub T);
|
|
|
|
#[async_trait]
|
|
impl<T, S> FromRequest<S> for ValidatedForm<T>
|
|
where
|
|
T: DeserializeOwned + Validate,
|
|
S: Send + Sync,
|
|
Form<T>: FromRequest<S, Rejection = FormRejection>,
|
|
{
|
|
type Rejection = AppError;
|
|
|
|
async fn from_request(req: Request, state: &S) -> Result<Self, Self::Rejection> {
|
|
let Form(value) = Form::<T>::from_request(req, state).await?;
|
|
value.validate()?;
|
|
Ok(ValidatedForm(value))
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Clone, Copy, Default)]
|
|
pub struct ValidatedJson<T>(pub T);
|
|
|
|
#[async_trait]
|
|
impl<T, S> FromRequest<S> for ValidatedJson<T>
|
|
where
|
|
T: DeserializeOwned + Validate,
|
|
S: Send + Sync,
|
|
Json<T>: FromRequest<S, Rejection = JsonRejection>,
|
|
{
|
|
type Rejection = AppError;
|
|
|
|
async fn from_request(req: Request, state: &S) -> Result<Self, Self::Rejection> {
|
|
let Json(value) = Json::<T>::from_request(req, state).await?;
|
|
value.validate()?;
|
|
Ok(ValidatedJson(value))
|
|
}
|
|
}
|
|
|
|
pub static EMAIL_REGEX: LazyLock<Regex> = LazyLock::new(|| {
|
|
Regex::new(r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$").expect("Regex is valid")
|
|
});
|