logline_core/
consequence.rs

1#[cfg(not(feature = "std"))]
2use alloc::{string::String, vec::Vec};
3#[cfg(feature = "std")]
4use std::{string::String, vec::Vec};
5
6/// Consequência positiva obrigatória (invariant do Paper I).
7///
8/// Define o que acontece quando a ação é executada com sucesso.
9/// O campo `effects` lista as ações secundárias que devem ser executadas.
10///
11/// # Exemplo
12///
13/// ```rust
14/// use logline_core::Outcome;
15///
16/// let outcome = Outcome {
17///     label: "approved".into(),
18///     effects: vec!["emit_receipt".into(), "notify_user".into()],
19/// };
20/// ```
21#[derive(Clone, Debug, PartialEq)]
22#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
23pub struct Outcome {
24    /// Rótulo descritivo da consequência.
25    pub label: String,
26    /// Lista de efeitos secundários a serem executados.
27    pub effects: Vec<String>,
28}
29
30/// Via de dúvida obrigatória (invariant do Paper I).
31///
32/// Define para onde a ação deve ser encaminhada quando há dúvida sobre sua execução.
33/// Pode ser um papel, fila, DID ou outro identificador de destino.
34///
35/// # Exemplo
36///
37/// ```rust
38/// use logline_core::Escalation;
39///
40/// let escalation = Escalation {
41///     label: "manual_review".into(),
42///     route_to: "auditor".into(),
43/// };
44/// ```
45#[derive(Clone, Debug, PartialEq)]
46#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
47pub struct Escalation {
48    /// Rótulo descritivo da escalação.
49    pub label: String,
50    /// Destino da escalação (ex: role, queue, DID).
51    pub route_to: String,
52}
53
54/// Fallback/erro obrigatório (invariant do Paper I).
55///
56/// Define o que acontece quando a ação falha. O campo `action` especifica
57/// a ação de compensação ou notificação a ser executada.
58///
59/// # Exemplo
60///
61/// ```rust
62/// use logline_core::FailureHandling;
63///
64/// let failure = FailureHandling {
65///     label: "rejected".into(),
66///     action: "compensate".into(),
67/// };
68/// ```
69#[derive(Clone, Debug, PartialEq)]
70#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
71pub struct FailureHandling {
72    /// Rótulo descritivo do tratamento de falha.
73    pub label: String,
74    /// Ação a ser executada (ex: "compensate", "refund", "notify").
75    pub action: String,
76}
77
78impl Outcome {
79    /// Verifica se o Outcome está vazio (invariant não satisfeito).
80    ///
81    /// Um Outcome vazio não satisfaz os invariants obrigatórios do Paper I.
82    pub fn is_empty(&self) -> bool {
83        self.label.is_empty()
84    }
85}
86impl Escalation {
87    /// Verifica se a Escalation está vazia (invariant não satisfeito).
88    ///
89    /// Uma Escalation vazia não satisfaz os invariants obrigatórios do Paper I.
90    pub fn is_empty(&self) -> bool {
91        self.label.is_empty() || self.route_to.is_empty()
92    }
93}
94impl FailureHandling {
95    /// Verifica se o FailureHandling está vazio (invariant não satisfeito).
96    ///
97    /// Um FailureHandling vazio não satisfaz os invariants obrigatórios do Paper I.
98    pub fn is_empty(&self) -> bool {
99        self.label.is_empty() || self.action.is_empty()
100    }
101}