strev 0.5.0

Event-driven pub/sub messaging library with compile-time ack safety
Documentation
use crate::error::HandlerError;
use crate::handler::{Handler, HandlerResult};
use crate::message::{Message, Pending};
use crate::middleware::Middleware;

pub struct RandomFail {
    pub probability: f32,
}

impl Middleware for RandomFail {
    fn wrap(&self, next: Box<dyn Handler>) -> Box<dyn Handler> {
        Box::new(RandomFailHandler {
            probability: self.probability,
            next,
        })
    }
}

struct RandomFailHandler {
    probability: f32,
    next: Box<dyn Handler>,
}

#[async_trait::async_trait]
impl Handler for RandomFailHandler {
    async fn handle(&self, msg: Message<Pending>) -> Result<HandlerResult, HandlerError> {
        let hash = msg.uuid().as_bytes()[0] as f32 / 255.0;
        if hash < self.probability {
            let _ = msg.nack();
            return Err(HandlerError::Processing("random failure".into()));
        }
        self.next.handle(msg).await
    }
}