1use async_trait::async_trait;
2use tide::{Middleware, Next, Request};
3
4use crate::{Flash, FlashStore};
5
6pub struct FlashMiddleware<Store> {
7 pub store: Store,
8}
9
10impl<Store: FlashStore> FlashMiddleware<Store> {
11 pub fn new(store: Store) -> Self {
12 Self { store }
13 }
14}
15
16#[async_trait]
17impl<State, Store> Middleware<State> for FlashMiddleware<Store>
18where
19 State: Clone + Send + Sync + 'static,
20 Store: FlashStore,
21{
22 async fn handle(&self, request: Request<State>, next: Next<'_, State>) -> tide::Result {
23 let messages = self.store.load(&request);
24 let mut res = next.run(request).await;
25 if res.ext::<Flash>().is_some() {
26 self.store.insert(&mut res);
27 } else if messages.is_some() && !messages.unwrap().is_empty() {
28 self.store.clear(&mut res);
29 }
30 Ok(res)
31 }
32}