logline_core/
payload.rs

1#[cfg(not(feature = "std"))]
2use alloc::{string::String, vec::Vec};
3#[cfg(feature = "std")]
4use std::{string::String, vec::Vec};
5
6/// Carga útil da ação (payload).
7///
8/// Paper I §3.1: o payload deve ser JSON estrito validado por schema do verbo.
9/// Em v0.1.0, suporta `None`, `Text`, `Bytes` e `Json` (com feature `serde`).
10///
11/// # Exemplo
12///
13/// ```rust
14/// use logline_core::Payload;
15///
16/// let none = Payload::None;
17/// let text = Payload::Text("Hello".into());
18/// let bytes = Payload::Bytes(vec![1, 2, 3]);
19///
20/// assert_eq!(none.kind(), "none");
21/// assert_eq!(text.kind(), "text");
22/// assert_eq!(bytes.kind(), "bytes");
23/// ```
24#[derive(Clone, Debug, PartialEq)]
25#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
26pub enum Payload {
27    /// Sem payload.
28    None,
29    /// Payload como string de texto.
30    Text(String),
31    /// Payload como bytes brutos.
32    Bytes(Vec<u8>),
33    /// JSON estrito validado por schema do verbo (Paper I §3.1).
34    ///
35    /// Disponível apenas com feature `serde`.
36    #[cfg(feature = "serde")]
37    Json(::serde_json::Value),
38}
39
40impl Payload {
41    /// Retorna o tipo do payload como string ("none", "text", "bytes", "json").
42    pub fn kind(&self) -> &'static str {
43        match self {
44            Payload::None => "none",
45            Payload::Text(_) => "text",
46            Payload::Bytes(_) => "bytes",
47            #[cfg(feature = "serde")]
48            Payload::Json(_) => "json",
49        }
50    }
51}