use std::future::Future; use std::pin::Pin; use actix_web::dev::Payload; use actix_web::{FromRequest, HttpRequest}; use serde::Deserialize; use utoipa::IntoParams; use uuid::Uuid; use crate::errors::ApiError; #[derive(Debug, Clone, Deserialize, IntoParams)] pub struct PolicyPath { pub space_name: String, pub repo_name: String, pub policy_id: Uuid, } impl FromRequest for PolicyPath { type Error = ApiError; type Future = Pin>>>; fn from_request(request: &HttpRequest, _payload: &mut Payload) -> Self::Future { let request = request.clone(); Box::pin(async move { actix_web::web::Path::::from_request(&request, &mut Payload::None) .await .map(|value| value.into_inner()) .map_err(|_| ApiError::bad_request()) }) } }