ubl_runtime/
mw.rs

1//! Middleware traits and budget tracking for DIM processing.
2use anyhow::Result;
3use ubl_types::{ActorId, Dim};
4use std::collections::HashMap;
5
6/// Middleware simples (before/after).
7pub trait Middleware: Send + Sync {
8    /// Executa antes do handler.
9    ///
10    /// # Errors
11    ///
12    /// - Implementações podem sinalizar erros de autorização/validação
13    fn before(&self, _dim: Dim, _actor: &ActorId, _in: &[u8], _ctx: &crate::AppCtx) -> Result<()> {
14        Ok(())
15    }
16    /// Executa depois do handler.
17    ///
18    /// # Errors
19    ///
20    /// - Implementações podem sinalizar erros de auditoria/telemetria
21    fn after(
22        &self,
23        _dim: Dim,
24        _actor: &ActorId,
25        _in: &[u8],
26        _out: &[u8],
27        _ctx: &crate::AppCtx,
28    ) -> Result<()> {
29        Ok(())
30    }
31}
32
33/// Controle de budgets (cotas) por ator.
34#[derive(Default)]
35pub struct Budgets {
36    map: HashMap<String, i64>,
37}
38impl Budgets {
39    /// Configura quota para um ator.
40    pub fn set(&mut self, actor: &ActorId, quota: i64) {
41        self.map.insert(actor.0.clone(), quota);
42    }
43    /// Consome 1 e retorna o restante (se houver registro). None => sem budget.
44    pub fn consume(&mut self, actor: &ActorId, amount: i64) -> Option<i64> {
45        self.map.get_mut(&actor.0).map(|v| {
46            *v = (*v - amount).max(0);
47            *v
48        })
49    }
50}