roopes_core/aggregates/transforming_handler/
mod.rs

1//! Combines a transformer and a handler to create a new handler which conforms
2//! to the transformer's input, but forwards its output to the handler.
3#[cfg(test)]
4mod tests;
5
6use crate::prelude::*;
7use std::marker::PhantomData;
8
9/// Combines a transformer and a handler to create a new handler which conforms
10/// to the transformer's input, but forwards its output to the handler.
11pub struct TransformingHandler<T, H, TI, HI>
12where
13    T: Transformer<TI, HI>,
14    H: Handler<HI>,
15{
16    transformer: T,
17    handler: H,
18    _phantom_data: PhantomData<(TI, HI)>,
19}
20
21impl<T, H, TI, HI> TransformingHandler<T, H, TI, HI>
22where
23    T: Transformer<TI, HI>,
24    H: Handler<HI>,
25{
26    /// Creates a new [`TransformingHandler`] which transforms its input and
27    /// forwards the result to the given handler.
28    pub fn new(
29        transformer: T,
30        handler: H,
31    ) -> Self
32    {
33        TransformingHandler {
34            transformer,
35            handler,
36            _phantom_data: PhantomData,
37        }
38    }
39}
40
41impl<T, H, TI, HI> From<(T, H)> for TransformingHandler<T, H, TI, HI>
42where
43    T: Transformer<TI, HI>,
44    H: Handler<HI>,
45{
46    fn from(value: (T, H)) -> Self
47    {
48        TransformingHandler::new(value.0, value.1)
49    }
50}
51
52impl<T, H, TI, HI> Handler<TI> for TransformingHandler<T, H, TI, HI>
53where
54    T: Transformer<TI, HI>,
55    H: Handler<HI>,
56{
57    fn handle(
58        &self,
59        message: &TI,
60    )
61    {
62        let result = self.transformer.transform(message);
63        self.handler.handle(&result);
64    }
65}
66
67/// Default export types
68pub mod prelude
69{
70    pub use super::TransformingHandler;
71}