//! Özel extractor'lar. use axum::{ Json, extract::{FromRequest, Request}, }; use serde::de::DeserializeOwned; use validator::Validate; use crate::error::AppError; /// `Json` gibi çalışır, ek olarak `validator` kurallarını da kontrol eder. /// Hatalı JSON veya geçersiz alanlarda Türkçe 400 hatası döner. pub struct ValidJson(pub T); impl FromRequest for ValidJson where T: DeserializeOwned + Validate, S: Send + Sync, { type Rejection = AppError; async fn from_request(req: Request, state: &S) -> Result { let Json(value) = Json::::from_request(req, state).await.map_err(|e| { tracing::debug!(error = %e, "JSON okunamadı"); AppError::BadRequest("Gönderilen veri okunamadı veya eksik alan var".into()) })?; value.validate()?; Ok(Self(value)) } }