1#![deny(clippy::all, clippy::pedantic, clippy::cargo, unsafe_code, rustdoc::all)]
2#![allow(clippy::module_name_repetitions)]
3#![allow(clippy::multiple_crate_versions)]
4
5#[macro_use]
13extern crate static_assertions;
14#[macro_use]
15pub(crate) mod macros;
16
17pub mod object_ref;
18pub use object_ref::ObjectRef;
19pub mod interface;
20pub use interface::{Interface, InterfaceSet};
21pub mod state;
22pub use state::{State, StateSet};
23pub mod cache;
24pub use cache::{CacheItem, LegacyCacheItem};
25pub mod error;
26pub use error::AtspiError;
27pub mod events;
28pub use events::{BusProperties, Event, EventProperties, EventTypeProperties};
29mod role;
30pub use role::Role;
31mod relation_type;
32pub use relation_type::RelationType;
33
34use serde::{Deserialize, Serialize};
35use zvariant::Type;
36
37pub type Result<T> = std::result::Result<T, AtspiError>;
38
39pub type MatchArgs<'a> = (
40 &'a [i32],
41 MatchType,
42 std::collections::HashMap<&'a str, &'a str>,
43 MatchType,
44 &'a [i32],
45 MatchType,
46 &'a [&'a str],
47 MatchType,
48 bool,
49);
50
51#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, Type)]
52#[repr(u32)]
53pub enum SortOrder {
58 Invalid,
60 Canonical,
62 Flow,
64 Tab,
66 ReverseCanonical,
68 ReverseFlow,
70 ReverseTab,
72}
73
74#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, Type)]
76#[repr(u32)]
77pub enum TreeTraversalType {
78 RestrictChildren,
80 RestrictSibling,
82 Inorder,
84}
85
86#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, Type)]
87#[repr(i32)]
88pub enum MatchType {
92 Invalid,
94 All,
96 Any,
98 NA,
100 Empty,
103}
104
105#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, Type)]
106#[repr(u32)]
107pub enum CoordType {
109 Screen,
111 Window,
113 Parent,
115}
116
117#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, Serialize, Deserialize, Type)]
118#[repr(u32)]
119pub enum ClipType {
121 Neither,
123 Min,
125 Max,
127 Both,
129}
130
131#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, Serialize, Deserialize, Type)]
132#[repr(u32)]
133pub enum Granularity {
135 Char,
137 Word,
139 Sentence,
141 Line,
143 Paragraph,
145}
146
147#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, Type)]
162pub enum Layer {
163 Invalid,
165 Background,
168 Canvas,
171 Widget,
173 Mdi,
178 Popup,
180 Overlay,
182 Window,
184}
185
186#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, Type)]
188pub enum ScrollType {
189 TopLeft,
191 BottomRight,
193 TopEdge,
195 BottomEdge,
197 LeftEdge,
199 RightEdge,
201 Anywhere,
203}
204
205#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize, Type)]
211#[repr(i32)]
212pub enum Live {
213 #[default]
215 None,
216 Polite,
218 Assertive,
220}
221
222impl TryFrom<i32> for Live {
223 type Error = AtspiError;
224
225 fn try_from(value: i32) -> std::result::Result<Self, Self::Error> {
226 match value {
227 0 => Ok(Live::None),
228 1 => Ok(Live::Polite),
229 2 => Ok(Live::Assertive),
230 _ => Err(AtspiError::Conversion("Unknown Live variant")),
231 }
232 }
233}
234
235#[cfg(test)]
236mod tests {
237 use super::*;
238 use zbus_lockstep::{
239 method_args_signature, method_return_signature, signal_body_type_signature,
240 };
241
242 #[test]
243 fn convert_i32_to_live() {
244 assert_eq!(Live::None, Live::try_from(0).unwrap());
245 assert_eq!(Live::Polite, Live::try_from(1).unwrap());
246 assert_eq!(Live::Assertive, Live::try_from(2).unwrap());
247 assert!(Live::try_from(3).is_err());
248 assert!(Live::try_from(-1).is_err());
249 }
250
251 #[test]
252 fn validate_live_signature() {
253 let signature = signal_body_type_signature!("Announcement");
254 let politeness_signature = signature.slice(1..2);
255 assert_eq!(Live::signature(), politeness_signature);
256 }
257
258 #[test]
259 fn validate_scroll_type_signature() {
260 let signature = method_args_signature!(member: "ScrollTo", interface: "org.a11y.atspi.Component", argument: "type");
261 assert_eq!(ScrollType::signature(), signature);
262 }
263
264 #[test]
265 fn validate_layer_signature() {
266 let signature = method_return_signature!("GetLayer");
267 assert_eq!(Layer::signature(), signature);
268 }
269
270 #[test]
271 fn validate_granularity_signature() {
272 let signature = method_args_signature!(member: "GetStringAtOffset", interface: "org.a11y.atspi.Text", argument: "granularity");
273 assert_eq!(Granularity::signature(), signature);
274 }
275
276 #[test]
277 fn validate_clip_type_signature() {
278 let signature = method_args_signature!(member: "GetTextAtOffset", interface: "org.a11y.atspi.Text", argument: "type");
279 assert_eq!(ClipType::signature(), signature);
280 }
281
282 #[test]
283 fn validate_coord_type_signature() {
284 let signature = method_args_signature!(member: "GetImagePosition", interface: "org.a11y.atspi.Image", argument: "coordType");
285 assert_eq!(CoordType::signature(), signature);
286 }
287
288 #[test]
289 fn validate_match_type_signature() {
290 let rule_signature = method_args_signature!(member: "GetMatchesTo", interface: "org.a11y.atspi.Collection", argument: "rule");
291 let match_type_signature = rule_signature.slice(3..4);
292 assert_eq!(MatchType::signature(), match_type_signature);
293 }
294
295 #[test]
296 fn validate_tree_traversal_type_signature() {
297 let signature = method_args_signature!(member: "GetMatchesTo", interface: "org.a11y.atspi.Collection", argument: "tree");
298 assert_eq!(TreeTraversalType::signature(), signature);
299 }
300
301 #[test]
302 fn validate_sort_order_signature() {
303 let signature = method_args_signature!(member: "GetMatches", interface: "org.a11y.atspi.Collection", argument: "sortby");
304 assert_eq!(SortOrder::signature(), signature);
305 }
306}