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}