logline_core/
verb.rs

1#[cfg(not(feature = "std"))]
2use alloc::string::String;
3#[cfg(feature = "std")]
4use std::string::String;
5
6/// Verbo que descreve a ação executada.
7///
8/// Paper I §3.1: verbos devem ser validados contra ALLOWED_ACTIONS via `VerbRegistry`.
9/// Verbos canônicos são `Transfer`, `Deploy`, `Approve`. Verbos customizados são permitidos
10/// via `Custom(String)`, mas devem passar pela validação do registry.
11///
12/// # Exemplo
13///
14/// ```rust
15/// use logline_core::Verb;
16///
17/// let canonical = Verb::Transfer;
18/// let custom = Verb::Custom("approve_budget".into());
19///
20/// assert_eq!(canonical.as_str(), "transfer");
21/// assert_eq!(custom.as_str(), "approve_budget");
22/// ```
23#[derive(Clone, Debug, PartialEq)]
24#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25pub enum Verb {
26    /// Transferência de recursos (ex: dinheiro, tokens, dados).
27    Transfer,
28    /// Deploy de artefato (ex: código, configuração, serviço).
29    Deploy,
30    /// Aprovação de ação ou decisão.
31    Approve,
32    /// Verbo customizado (deve ser validado via `VerbRegistry`).
33    Custom(String),
34}
35
36impl Verb {
37    /// Retorna a representação string do verbo.
38    ///
39    /// Verbos canônicos retornam suas strings fixas, enquanto `Custom` retorna
40    /// a string fornecida.
41    pub fn as_str(&self) -> &str {
42        match self {
43            Verb::Transfer => "transfer",
44            Verb::Deploy => "deploy",
45            Verb::Approve => "approve",
46            Verb::Custom(s) => s.as_str(),
47        }
48    }
49}
50
51/// Registry para validar verbos contra ALLOWED_ACTIONS (Paper I §3.1).
52/// Implementações devem verificar se o verbo está no registro permitido.
53pub trait VerbRegistry {
54    /// Retorna `true` se o verbo está permitido no sistema.
55    fn is_allowed(&self, verb: &Verb) -> bool;
56}