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 action;
18pub use action::Action;
19pub mod object_match;
20pub use object_match::{MatchType, ObjectMatchRule, SortOrder, TreeTraversalType};
21pub mod object_ref;
22pub use object_ref::ObjectRef;
23pub mod operation;
24pub use operation::Operation;
25pub mod interface;
26pub use interface::{Interface, InterfaceSet};
27pub mod state;
28pub use state::{State, StateSet};
29pub mod cache;
30pub use cache::{CacheItem, LegacyCacheItem};
31pub mod error;
32pub use error::AtspiError;
33pub mod events;
34#[cfg(feature = "wrappers")]
35pub use events::Event;
36pub use events::{BusProperties, EventProperties, EventTypeProperties};
37mod role;
38pub use role::Role;
39mod relation_type;
40pub use relation_type::RelationType;
41
42use serde::{Deserialize, Serialize};
43use zvariant::Type;
44
45pub type Result<T> = std::result::Result<T, AtspiError>;
46
47#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Type)]
52pub struct TextSelection {
53 start_obj: ObjectRef,
55 start_idx: i32,
57 end_obj: ObjectRef,
59 end_idx: i32,
61 start_is_active: bool,
66}
67
68#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, Type)]
69#[repr(u32)]
70pub enum CoordType {
72 Screen,
74 Window,
76 Parent,
78}
79
80#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, Serialize, Deserialize, Type)]
81#[repr(u32)]
82pub enum ClipType {
84 Neither,
86 Min,
88 Max,
90 Both,
92}
93
94#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, Serialize, Deserialize, Type)]
95#[repr(u32)]
96pub enum Granularity {
98 Char,
100 Word,
102 Sentence,
104 Line,
106 Paragraph,
108}
109
110#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, Type)]
125pub enum Layer {
126 Invalid,
128 Background,
131 Canvas,
134 Widget,
136 Mdi,
141 Popup,
143 Overlay,
145 Window,
147}
148
149#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, Type)]
151pub enum ScrollType {
152 TopLeft,
154 BottomRight,
156 TopEdge,
158 BottomEdge,
160 LeftEdge,
162 RightEdge,
164 Anywhere,
166}
167
168#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize, Type)]
176#[repr(i32)]
177pub enum Politeness {
178 #[default]
180 None = 0,
181 Polite = 1,
183 Assertive = 2,
185}
186
187impl TryFrom<i32> for Politeness {
188 type Error = AtspiError;
189
190 fn try_from(value: i32) -> std::result::Result<Self, Self::Error> {
191 match value {
192 0 => Ok(Politeness::None),
193 1 => Ok(Politeness::Polite),
194 2 => Ok(Politeness::Assertive),
195 _ => Err(AtspiError::Conversion("Unknown Politeness variant")),
196 }
197 }
198}
199
200#[cfg(test)]
201mod tests {
202 use super::*;
203 use std::str::FromStr;
204 use zbus_lockstep::{
205 method_args_signature, method_return_signature, signal_body_type_signature,
206 };
207 use zvariant::Signature;
208
209 #[test]
210 fn convert_i32_to_live() {
211 assert_eq!(Politeness::None, Politeness::try_from(0).unwrap());
212 assert_eq!(Politeness::Polite, Politeness::try_from(1).unwrap());
213 assert_eq!(Politeness::Assertive, Politeness::try_from(2).unwrap());
214 assert!(Politeness::try_from(3).is_err());
215 assert!(Politeness::try_from(-1).is_err());
216 }
217
218 #[test]
219 fn validate_live_signature() {
220 let signature = signal_body_type_signature!("Announcement");
221 let politeness_signature_str = &signature.to_string_no_parens();
222 let politeness_signature = Signature::from_str(&politeness_signature_str.as_str()[1..2])
223 .expect("Valid signature pattern");
224 assert_eq!(*<Politeness as Type>::SIGNATURE, politeness_signature);
225 }
226
227 #[test]
228 fn validate_scroll_type_signature() {
229 let signature = method_args_signature!(member: "ScrollTo", interface: "org.a11y.atspi.Component", argument: "type");
230 assert_eq!(*<ScrollType as Type>::SIGNATURE, signature);
231 }
232
233 #[test]
234 fn validate_layer_signature() {
235 let signature = method_return_signature!("GetLayer");
236 assert_eq!(*<Layer as Type>::SIGNATURE, signature);
237 }
238
239 #[test]
240 fn validate_granularity_signature() {
241 let signature = method_args_signature!(member: "GetStringAtOffset", interface: "org.a11y.atspi.Text", argument: "granularity");
242 assert_eq!(*<Granularity as Type>::SIGNATURE, signature);
243 }
244
245 #[test]
246 fn validate_clip_type_signature() {
247 let signature = method_args_signature!(member: "GetTextAtOffset", interface: "org.a11y.atspi.Text", argument: "type");
248 assert_eq!(*<ClipType as Type>::SIGNATURE, signature);
249 }
250
251 #[test]
252 fn validate_coord_type_signature() {
253 let signature = method_args_signature!(member: "GetImagePosition", interface: "org.a11y.atspi.Image", argument: "coordType");
254 assert_eq!(*<CoordType as Type>::SIGNATURE, signature);
255 }
256
257 #[test]
258 fn validate_match_type_signature() {
259 let rule_signature = method_args_signature!(member: "GetMatchesTo", interface: "org.a11y.atspi.Collection", argument: "rule");
260 let match_type_signature_str = rule_signature.to_string();
261 let match_type_signature = Signature::from_str(&match_type_signature_str.as_str()[3..4])
262 .expect("Valid signature pattern");
263 assert_eq!(*<MatchType as Type>::SIGNATURE, match_type_signature);
264 }
265
266 #[test]
267 fn validate_text_selection_signature() {
268 let selection_signature = method_args_signature!(member: "GetTextSelections", interface: "org.a11y.atspi.Document", argument: "selections");
269 let selection_signature_str = selection_signature.to_string();
270 let selection_signature = Signature::from_str(&selection_signature_str.as_str()[1..])
271 .expect("Valid signature pattern");
272 assert_eq!(*<TextSelection as Type>::SIGNATURE, selection_signature);
274 }
275}