1use serde::{Deserialize, Deserializer, Serialize};
4
5fn 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#[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#[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#[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#[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#[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#[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#[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}