tide-flash 0.1.0

Tide (http-rs/tide) Flash Messages Middleware
Documentation
use async_trait::async_trait;
use tide::{Middleware, Next, Request};

use crate::{Flash, FlashStore};

pub struct FlashMiddleware<Store> {
    pub store: Store,
}

impl<Store: FlashStore> FlashMiddleware<Store> {
    pub fn new(store: Store) -> Self {
        Self { store }
    }
}

#[async_trait]
impl<State, Store> Middleware<State> for FlashMiddleware<Store>
where
    State: Clone + Send + Sync + 'static,
    Store: FlashStore,
{
    async fn handle(&self, request: Request<State>, next: Next<'_, State>) -> tide::Result {
        let messages = self.store.load(&request);
        let mut res = next.run(request).await;
        if res.ext::<Flash>().is_some() {
            self.store.insert(&mut res);
        } else if messages.is_some() && !messages.unwrap().is_empty() {
            self.store.clear(&mut res);
        }
        Ok(res)
    }
}