micro_web/date/
date_service_decorator.rs1use crate::date::DateService;
14use crate::handler::RequestHandler;
15use crate::handler::handler_decorator::HandlerDecorator;
16use crate::handler::handler_decorator_factory::HandlerDecoratorFactory;
17use crate::{OptionReqBody, RequestContext, ResponseBody};
18use async_trait::async_trait;
19use http::Response;
20
21#[derive(Clone)]
26pub struct DateServiceDecorator;
27
28pub struct DateResponseHandler<H> {
34 handler: H,
35 date_service: &'static DateService,
37}
38
39impl<H: RequestHandler> HandlerDecorator<H> for DateServiceDecorator {
40 type Output = DateResponseHandler<H>;
41
42 fn decorate(&self, raw: H) -> Self::Output {
43 DateResponseHandler { handler: raw, date_service: DateService::get_global_instance() }
44 }
45}
46
47impl HandlerDecoratorFactory for DateServiceDecorator {
48 type Output<In>
49 = DateServiceDecorator
50 where
51 In: RequestHandler;
52
53 fn create_decorator<In>(&self) -> Self::Output<In>
54 where
55 In: RequestHandler,
56 {
57 DateServiceDecorator
58 }
59}
60
61#[async_trait]
62impl<H: RequestHandler> RequestHandler for DateResponseHandler<H> {
63 async fn invoke<'server, 'req>(&self, req: &mut RequestContext<'server, 'req>, req_body: OptionReqBody) -> Response<ResponseBody> {
64 let mut resp = self.handler.invoke(req, req_body).await;
65
66 self.date_service.with_http_date(|date_header_value| {
67 resp.headers_mut().insert(http::header::DATE, date_header_value);
68 });
69
70 resp
71 }
72}