pub mod container;
pub mod legacy;
pub mod range;
pub mod table;
pub mod text;
pub mod toggle;
pub mod value;
use crate::uia::element::UiAutomationElement;
use std::{fmt::Formatter, sync::Weak};
use windows::Win32::UI::Accessibility::{IUIAutomation6, UIA_PATTERN_ID};
use windows_core::Interface;
pub struct PatternError {
message: String,
}
impl From<String> for PatternError {
fn from(value: String) -> Self {
Self { message: value }
}
}
impl std::fmt::Debug for PatternError {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.message)
}
}
pub trait PatternCreator<I: Interface>: TryFrom<I> + Sized {
const PATTERN: UIA_PATTERN_ID;
fn obtain(value: &UiAutomationElement) -> Result<Self, PatternError>
where
<Self as TryFrom<I>>::Error: std::fmt::Debug,
{
let pattern = unsafe { value.get_raw().GetCurrentPattern(Self::PATTERN) };
let pattern = pattern
.map_err(|e| -> PatternError {
format!("Can't get the Pattern({:?}). ({})", Self::PATTERN, e).into()
})?
.cast::<I>()
.unwrap();
Self::try_from(pattern).map_err(|e| format!("Can't create pattern. ({:?})", e).into())
}
}
pub trait PatternCreatorWithAutomation<I: Interface>:
TryFrom<(I, Weak<IUIAutomation6>)> + Sized
{
const PATTERN: UIA_PATTERN_ID;
fn obtain(value: &UiAutomationElement) -> Result<Self, PatternError>
where
<Self as TryFrom<(I, Weak<IUIAutomation6>)>>::Error: std::fmt::Debug,
{
let pattern = unsafe { value.get_raw().GetCurrentPattern(Self::PATTERN) };
let pattern = pattern
.map_err(|e| -> PatternError {
format!("Can't get the Pattern({:?}). ({})", Self::PATTERN, e).into()
})?
.cast::<I>()
.unwrap();
Self::try_from((pattern, value.get_aut()))
.map_err(|e| format!("Can't create pattern. ({:?})", e).into())
}
}