ubl_runtime/
router.rs

1//! DIM router that maps DIM codes to handlers and runs before/after middleware.
2use crate::mw::Middleware;
3use anyhow::Result;
4use ubl_types::Dim;
5use std::{collections::HashMap, sync::Arc};
6
7/// Função de tratamento (DIM → bytes).
8pub type HandlerFn = dyn Fn(&[u8]) -> Result<Vec<u8>> + Send + Sync + 'static;
9/// Wrapper para mover closures p/ Arc.
10pub struct FnHandler<F>(pub F);
11impl<F> FnHandler<F>
12where
13    F: Fn(&[u8]) -> Result<Vec<u8>> + Send + Sync + 'static,
14{
15    /// Converte para `Arc<HandlerFn>`.
16    pub fn into_arc(self) -> Arc<HandlerFn> {
17        Arc::new(self.0)
18    }
19}
20
21/// Router com middlewares before/after.
22#[derive(Default)]
23pub struct Router {
24    pub(crate) map: HashMap<u16, Arc<HandlerFn>>,
25    pub(crate) mw_before: Vec<Box<dyn Middleware>>,
26    pub(crate) mw_after: Vec<Box<dyn Middleware>>,
27}
28impl Router {
29    /// Registra handler para DIM.
30    pub fn add<F>(&mut self, dim: Dim, h: FnHandler<F>)
31    where
32        F: Fn(&[u8]) -> Result<Vec<u8>> + Send + Sync + 'static,
33    {
34        self.map.insert(dim.0, h.into_arc());
35    }
36    /// Busca handler para DIM.
37    #[must_use]
38    pub fn get(&self, dim: Dim) -> Option<Arc<HandlerFn>> {
39        self.map.get(&dim.0).cloned()
40    }
41    /// Adiciona middleware "before".
42    pub fn use_before<M: Middleware + 'static>(&mut self, m: M) {
43        self.mw_before.push(Box::new(m));
44    }
45    /// Adiciona middleware "after".
46    pub fn use_after<M: Middleware + 'static>(&mut self, m: M) {
47        self.mw_after.push(Box::new(m));
48    }
49}