34 lines
914 B
Rust
34 lines
914 B
Rust
use crate::{submissions::Submission, State};
|
|
use actix_web::{
|
|
dev::Payload,
|
|
web::{Data, Path},
|
|
FromRequest, HttpRequest,
|
|
};
|
|
use futures::future::LocalBoxFuture;
|
|
use uuid::Uuid;
|
|
|
|
#[derive(Clone, Debug, serde::Deserialize)]
|
|
struct SubmissionPath {
|
|
submission_id: Uuid,
|
|
}
|
|
|
|
impl FromRequest for Submission {
|
|
type Config = ();
|
|
type Error = actix_web::Error;
|
|
type Future = LocalBoxFuture<'static, Result<Self, Self::Error>>;
|
|
|
|
fn from_request(req: &HttpRequest, _: &mut Payload) -> Self::Future {
|
|
let state_fut = Data::<State>::extract(&req);
|
|
let submission_id_fut = Path::<SubmissionPath>::extract(&req);
|
|
|
|
Box::pin(async move {
|
|
let submission_id = submission_id_fut.await?.submission_id;
|
|
let state = state_fut.await?;
|
|
|
|
let submission = Submission::from_id(submission_id, &state)?;
|
|
|
|
Ok(submission)
|
|
})
|
|
}
|
|
}
|