#![deny(clippy::all, clippy::pedantic, clippy::cargo, unsafe_code, rustdoc::all)]
#![allow(clippy::module_name_repetitions)]
#![allow(clippy::multiple_crate_versions)]
#[macro_use]
extern crate static_assertions;
#[macro_use]
pub(crate) mod macros;
pub mod action;
pub use action::Action;
pub mod object_match;
pub use object_match::{MatchType, ObjectMatchRule, SortOrder, TreeTraversalType};
pub mod object_ref;
pub use object_ref::ObjectRef;
pub mod operation;
pub use operation::Operation;
pub mod interface;
pub use interface::{Interface, InterfaceSet};
pub mod state;
pub use state::{State, StateSet};
pub mod cache;
pub use cache::{CacheItem, LegacyCacheItem};
pub mod error;
pub use error::AtspiError;
pub mod events;
#[cfg(feature = "wrappers")]
pub use events::Event;
pub use events::{BusProperties, EventProperties, EventTypeProperties};
mod role;
pub use role::Role;
mod relation_type;
pub use relation_type::RelationType;
use serde::{Deserialize, Serialize};
use zvariant::Type;
pub type Result<T> = std::result::Result<T, AtspiError>;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Type)]
pub struct TextSelection {
start_obj: ObjectRef,
start_idx: i32,
end_obj: ObjectRef,
end_idx: i32,
start_is_active: bool,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, Type)]
#[repr(u32)]
pub enum CoordType {
Screen,
Window,
Parent,
}
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, Serialize, Deserialize, Type)]
#[repr(u32)]
pub enum ClipType {
Neither,
Min,
Max,
Both,
}
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, Serialize, Deserialize, Type)]
#[repr(u32)]
pub enum Granularity {
Char,
Word,
Sentence,
Line,
Paragraph,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, Type)]
pub enum Layer {
Invalid,
Background,
Canvas,
Widget,
Mdi,
Popup,
Overlay,
Window,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, Type)]
pub enum ScrollType {
TopLeft,
BottomRight,
TopEdge,
BottomEdge,
LeftEdge,
RightEdge,
Anywhere,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize, Type)]
#[repr(i32)]
pub enum Politeness {
#[default]
None = 0,
Polite = 1,
Assertive = 2,
}
impl TryFrom<i32> for Politeness {
type Error = AtspiError;
fn try_from(value: i32) -> std::result::Result<Self, Self::Error> {
match value {
0 => Ok(Politeness::None),
1 => Ok(Politeness::Polite),
2 => Ok(Politeness::Assertive),
_ => Err(AtspiError::Conversion("Unknown Politeness variant")),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::str::FromStr;
use zbus_lockstep::{
method_args_signature, method_return_signature, signal_body_type_signature,
};
use zvariant::Signature;
#[test]
fn convert_i32_to_live() {
assert_eq!(Politeness::None, Politeness::try_from(0).unwrap());
assert_eq!(Politeness::Polite, Politeness::try_from(1).unwrap());
assert_eq!(Politeness::Assertive, Politeness::try_from(2).unwrap());
assert!(Politeness::try_from(3).is_err());
assert!(Politeness::try_from(-1).is_err());
}
#[test]
fn validate_live_signature() {
let signature = signal_body_type_signature!("Announcement");
let politeness_signature_str = &signature.to_string_no_parens();
let politeness_signature = Signature::from_str(&politeness_signature_str.as_str()[1..2])
.expect("Valid signature pattern");
assert_eq!(*<Politeness as Type>::SIGNATURE, politeness_signature);
}
#[test]
fn validate_scroll_type_signature() {
let signature = method_args_signature!(member: "ScrollTo", interface: "org.a11y.atspi.Component", argument: "type");
assert_eq!(*<ScrollType as Type>::SIGNATURE, signature);
}
#[test]
fn validate_layer_signature() {
let signature = method_return_signature!("GetLayer");
assert_eq!(*<Layer as Type>::SIGNATURE, signature);
}
#[test]
fn validate_granularity_signature() {
let signature = method_args_signature!(member: "GetStringAtOffset", interface: "org.a11y.atspi.Text", argument: "granularity");
assert_eq!(*<Granularity as Type>::SIGNATURE, signature);
}
#[test]
fn validate_clip_type_signature() {
let signature = method_args_signature!(member: "GetTextAtOffset", interface: "org.a11y.atspi.Text", argument: "type");
assert_eq!(*<ClipType as Type>::SIGNATURE, signature);
}
#[test]
fn validate_coord_type_signature() {
let signature = method_args_signature!(member: "GetImagePosition", interface: "org.a11y.atspi.Image", argument: "coordType");
assert_eq!(*<CoordType as Type>::SIGNATURE, signature);
}
#[test]
fn validate_match_type_signature() {
let rule_signature = method_args_signature!(member: "GetMatchesTo", interface: "org.a11y.atspi.Collection", argument: "rule");
let match_type_signature_str = rule_signature.to_string();
let match_type_signature = Signature::from_str(&match_type_signature_str.as_str()[3..4])
.expect("Valid signature pattern");
assert_eq!(*<MatchType as Type>::SIGNATURE, match_type_signature);
}
#[test]
fn validate_text_selection_signature() {
let selection_signature = method_args_signature!(member: "GetTextSelections", interface: "org.a11y.atspi.Document", argument: "selections");
let selection_signature_str = selection_signature.to_string();
let selection_signature = Signature::from_str(&selection_signature_str.as_str()[1..])
.expect("Valid signature pattern");
assert_eq!(*<TextSelection as Type>::SIGNATURE, selection_signature);
}
}