Skip to main content

synap_sdk/
types.rs

1//! Common types for Synap SDK
2
3use serde::{Deserialize, Deserializer, Serialize};
4
5/// Deserialize a value that may arrive as either a number or a string
6/// (RESP3 returns all scalars as strings).
7fn from_str_or_num<'de, D, T>(deserializer: D) -> Result<T, D::Error>
8where
9    D: Deserializer<'de>,
10    T: std::str::FromStr,
11    T::Err: std::fmt::Display,
12{
13    use serde::de::Error;
14    let value = serde_json::Value::deserialize(deserializer)?;
15    match &value {
16        serde_json::Value::Number(n) => {
17            let s = n.to_string();
18            s.parse::<T>().map_err(Error::custom)
19        }
20        serde_json::Value::String(s) => s.parse::<T>().map_err(Error::custom),
21        other => Err(Error::custom(format!(
22            "expected number or string, got {other}"
23        ))),
24    }
25}
26
27/// Queue message
28#[derive(Debug, Clone, Serialize, Deserialize)]
29pub struct Message {
30    pub id: String,
31    pub payload: Vec<u8>,
32    #[serde(default)]
33    pub priority: u8,
34    #[serde(default)]
35    pub retry_count: u32,
36    #[serde(default)]
37    pub max_retries: u32,
38    #[serde(skip_serializing_if = "Option::is_none", default)]
39    pub deadline: Option<u64>,
40}
41
42/// Queue statistics
43#[derive(Debug, Clone, Serialize, Deserialize)]
44pub struct QueueStats {
45    #[serde(deserialize_with = "from_str_or_num")]
46    pub depth: usize,
47    #[serde(deserialize_with = "from_str_or_num")]
48    pub consumers: usize,
49    #[serde(deserialize_with = "from_str_or_num")]
50    pub published: u64,
51    #[serde(deserialize_with = "from_str_or_num")]
52    pub consumed: u64,
53    #[serde(deserialize_with = "from_str_or_num")]
54    pub acked: u64,
55    #[serde(deserialize_with = "from_str_or_num")]
56    pub nacked: u64,
57    #[serde(deserialize_with = "from_str_or_num")]
58    pub dead_lettered: usize,
59}
60
61/// Stream event
62#[derive(Debug, Clone, Serialize, Deserialize)]
63pub struct Event {
64    #[serde(default)]
65    pub offset: u64,
66    #[serde(alias = "event_type")]
67    pub event: String,
68    pub data: serde_json::Value,
69    #[serde(default)]
70    pub timestamp: Option<u64>,
71}
72
73/// Stream statistics
74#[derive(Debug, Clone, Serialize, Deserialize, Default)]
75pub struct StreamStats {
76    #[serde(alias = "room", default)]
77    pub name: String,
78    #[serde(default)]
79    pub message_count: usize,
80    #[serde(default)]
81    pub max_offset: u64,
82    #[serde(default)]
83    pub total_published: u64,
84    #[serde(default)]
85    pub total_consumed: u64,
86    #[serde(default)]
87    pub subscriber_count: usize,
88}
89
90/// Pub/Sub message
91#[derive(Debug, Clone, Serialize, Deserialize)]
92pub struct PubSubMessage {
93    pub topic: String,
94    pub data: serde_json::Value,
95    #[serde(skip_serializing_if = "Option::is_none")]
96    pub priority: Option<u8>,
97    #[serde(skip_serializing_if = "Option::is_none")]
98    pub headers: Option<std::collections::HashMap<String, String>>,
99}
100
101/// KV Store statistics
102#[derive(Debug, Clone, Serialize, Deserialize)]
103pub struct KVStats {
104    pub total_keys: usize,
105    pub total_memory_bytes: usize,
106    pub hit_rate: f64,
107}
108
109/// HyperLogLog statistics
110#[derive(Debug, Clone, Serialize, Deserialize, Default)]
111pub struct HyperLogLogStats {
112    pub total_hlls: u64,
113    pub pfadd_count: u64,
114    pub pfcount_count: u64,
115    pub pfmerge_count: u64,
116    pub total_cardinality: u64,
117}