1use serde::{Deserialize, Serialize};
7use std::collections::HashMap;
8use zbus_names::{BusName, OwnedUniqueName};
9use zvariant::{as_value::optional, OwnedValue, Type};
10
11use super::Result;
12use crate::proxy;
13
14#[proxy(
18 interface = "org.freedesktop.DBus.Debug.Stats",
19 default_service = "org.freedesktop.DBus",
20 default_path = "/org/freedesktop/DBus"
21)]
22pub trait Stats {
23 fn get_stats(&self) -> Result<Stats>;
25
26 fn get_connection_stats(&self, name: BusName<'_>) -> Result<ConnectionStats>;
30
31 fn get_all_match_rules(&self) -> Result<HashMap<OwnedUniqueName, Vec<crate::OwnedMatchRule>>>;
36}
37
38#[derive(Debug, Default, Deserialize, PartialEq, Serialize, Type)]
40#[zvariant(signature = "a{sv}", rename_all = "PascalCase")]
41#[serde(default, rename_all = "PascalCase")]
42pub struct Stats {
43 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
44 pub(crate) serial: Option<u32>,
45 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
46 pub(crate) active_connections: Option<u32>,
47 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
48 pub(crate) incomplete_connections: Option<u32>,
49 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
50 pub(crate) match_rules: Option<u32>,
51 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
52 pub(crate) peak_match_rules: Option<u32>,
53 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
54 pub(crate) peak_match_rules_per_connection: Option<u32>,
55 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
56 pub(crate) bus_names: Option<u32>,
57 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
58 pub(crate) peak_bus_names: Option<u32>,
59 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
60 pub(crate) peak_bus_names_per_connection: Option<u32>,
61 #[serde(flatten)]
62 pub(crate) rest: HashMap<String, OwnedValue>,
63}
64
65impl Stats {
66 pub fn serial(&self) -> Option<u32> {
68 self.serial
69 }
70
71 pub fn active_connections(&self) -> Option<u32> {
75 self.active_connections
76 }
77
78 pub fn incomplete_connections(&self) -> Option<u32> {
83 self.incomplete_connections
84 }
85
86 pub fn match_rules(&self) -> Option<u32> {
88 self.match_rules
89 }
90
91 pub fn peak_match_rules(&self) -> Option<u32> {
93 self.peak_match_rules
94 }
95
96 pub fn peak_match_rules_per_connection(&self) -> Option<u32> {
99 self.peak_match_rules_per_connection
100 }
101
102 pub fn bus_names(&self) -> Option<u32> {
104 self.bus_names
105 }
106
107 pub fn peak_bus_names(&self) -> Option<u32> {
109 self.peak_bus_names
110 }
111
112 pub fn peak_bus_names_per_connection(&self) -> Option<u32> {
115 self.peak_bus_names_per_connection
116 }
117
118 pub fn rest(&self) -> &HashMap<String, OwnedValue> {
121 &self.rest
122 }
123}
124
125#[derive(Debug, Default, Deserialize, PartialEq, Serialize, Type)]
127#[zvariant(signature = "a{sv}")]
128#[serde(default, rename_all = "PascalCase")]
129pub struct ConnectionStats {
130 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
131 pub(crate) serial: Option<u32>,
132 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
133 pub(crate) unique_name: Option<OwnedUniqueName>,
134 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
135 pub(crate) match_rules: Option<u32>,
136 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
137 pub(crate) peak_match_rules: Option<u32>,
138 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
139 pub(crate) bus_names: Option<u32>,
140 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
141 pub(crate) peak_bus_names: Option<u32>,
142 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
143 pub(crate) incoming_messages: Option<u32>,
144 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
145 pub(crate) outgoing_messages: Option<u32>,
146 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
147 pub(crate) incoming_bytes: Option<u32>,
148 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
149 pub(crate) outgoing_bytes: Option<u32>,
150 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
151 pub(crate) incoming_fds: Option<u32>,
152 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
153 pub(crate) outgoing_fds: Option<u32>,
154 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
155 pub(crate) peak_incoming_messages: Option<u32>,
156 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
157 pub(crate) peak_outgoing_messages: Option<u32>,
158 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
159 pub(crate) peak_incoming_bytes: Option<u32>,
160 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
161 pub(crate) peak_outgoing_bytes: Option<u32>,
162 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
163 pub(crate) peak_incoming_fds: Option<u32>,
164 #[serde(with = "optional", skip_serializing_if = "Option::is_none")]
165 pub(crate) peak_outgoing_fds: Option<u32>,
166 #[serde(flatten)]
167 pub(crate) rest: HashMap<String, OwnedValue>,
168}
169
170impl ConnectionStats {
171 pub fn serial(&self) -> Option<u32> {
173 self.serial
174 }
175
176 pub fn unique_name(&self) -> Option<&OwnedUniqueName> {
178 self.unique_name.as_ref()
179 }
180
181 pub fn match_rules(&self) -> Option<u32> {
183 self.match_rules
184 }
185
186 pub fn peak_match_rules(&self) -> Option<u32> {
189 self.peak_match_rules
190 }
191
192 pub fn bus_names(&self) -> Option<u32> {
194 self.bus_names
195 }
196
197 pub fn peak_bus_names(&self) -> Option<u32> {
200 self.peak_bus_names
201 }
202
203 pub fn incoming_messages(&self) -> Option<u32> {
205 self.incoming_messages
206 }
207
208 pub fn outgoing_messages(&self) -> Option<u32> {
210 self.outgoing_messages
211 }
212
213 pub fn incoming_bytes(&self) -> Option<u32> {
215 self.incoming_bytes
216 }
217
218 pub fn outgoing_bytes(&self) -> Option<u32> {
220 self.outgoing_bytes
221 }
222
223 pub fn incoming_fds(&self) -> Option<u32> {
225 self.incoming_fds
226 }
227
228 pub fn outgoing_fds(&self) -> Option<u32> {
230 self.outgoing_fds
231 }
232
233 pub fn peak_incoming_messages(&self) -> Option<u32> {
236 self.peak_incoming_messages
237 }
238
239 pub fn peak_outgoing_messages(&self) -> Option<u32> {
242 self.peak_outgoing_messages
243 }
244
245 pub fn peak_incoming_bytes(&self) -> Option<u32> {
247 self.peak_incoming_bytes
248 }
249
250 pub fn peak_outgoing_bytes(&self) -> Option<u32> {
252 self.peak_outgoing_bytes
253 }
254
255 pub fn peak_incoming_fds(&self) -> Option<u32> {
258 self.peak_incoming_fds
259 }
260
261 pub fn peak_outgoing_fds(&self) -> Option<u32> {
264 self.peak_outgoing_fds
265 }
266
267 pub fn rest(&self) -> &HashMap<String, OwnedValue> {
270 &self.rest
271 }
272}