#[non_exhaustive]pub struct AppState {
pub app: AppInfo,
pub window: WindowInfo,
pub elements: Vec<Element>,
pub truncated: bool,
pub tree_included: bool,
pub focused: Option<usize>,
pub selected_text: Option<String>,
pub screenshot: Option<Screenshot>,
pub captured_at: SystemTime,
pub notes: Vec<String>,
}Expand description
A snapshot of one app window.
Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.app: AppInfoThe app.
window: WindowInfoThe captured window.
elements: Vec<Element>Accessibility elements in depth-first order; elements[i].index == i.
truncated: boolWhether node or depth limits cut the tree short.
tree_included: boolWhether the tree was requested at all.
focused: Option<usize>Index of the focused element, if it is part of the tree.
selected_text: Option<String>Currently selected text in the focused element.
screenshot: Option<Screenshot>Screenshot of the window.
captured_at: SystemTimeWhen the state was captured.
notes: Vec<String>Non-fatal problems encountered while capturing, e.g. why the screenshot is missing.
Implementations§
Source§impl AppState
impl AppState
Sourcepub fn focused_element(&self) -> Option<&Element>
pub fn focused_element(&self) -> Option<&Element>
The focused element.
Sourcepub fn find(
&self,
query: &ElementQuery,
) -> impl Iterator<Item = &Element> + use<'_>
pub fn find( &self, query: &ElementQuery, ) -> impl Iterator<Item = &Element> + use<'_>
Elements matching query, in tree order.
Examples found in repository?
examples/textedit.rs (line 23)
11fn main() -> computer_use::Result<()> {
12 use std::time::Duration;
13
14 use computer_use::{
15 CaptureOptions, ClickMethod, ClickOptions, ClickTarget, Computer, ElementQuery, Error, TextSelection,
16 };
17
18 const APP: &str = "TextEdit";
19 let mut computer = Computer::new()?.settle_delay(Duration::from_millis(300));
20 let tree_only = CaptureOptions::default().include_screenshot(false);
21
22 let state = computer.get_app_state(APP, &tree_only)?;
23 let new_doc = state.find(&ElementQuery::text("New Document").with_role("button").exact(true)).next();
24 if let Some(button) = new_doc.map(|e| e.index) {
25 println!(
26 "click New Document: {:?}",
27 computer.click(APP, ClickTarget::Element(button), ClickOptions::default())?
28 );
29 }
30
31 let state = computer.get_app_state(APP, &tree_only)?;
32 let text_area = state
33 .find(&ElementQuery::role("AXTextArea"))
34 .next()
35 .map(|e| e.index)
36 .ok_or_else(|| Error::StateUnavailable("no text area".into()))?;
37 println!(
38 "click text area {text_area}: {:?}",
39 computer.click(APP, ClickTarget::Element(text_area), ClickOptions::default())?
40 );
41 computer.set_value(APP, text_area, "")?;
42 computer.type_text(APP, "Hello from computer-use-rs!\nSecond line.")?;
43
44 let state = computer.get_app_state(APP, &tree_only)?;
45 let value = state.find(&ElementQuery::role("AXTextArea")).next().and_then(|e| e.value.clone());
46 println!("text area now contains: {value:?}");
47
48 computer.select_text(APP, text_area, &TextSelection::new("computer-use-rs"))?;
49 let state = computer.get_app_state(APP, &tree_only)?;
50 println!("selected text: {:?}", state.selected_text);
51
52 computer.press_key(APP, "BackSpace")?;
53 let state = computer.get_app_state(APP, &tree_only)?;
54 let value = state.find(&ElementQuery::role("AXTextArea")).next().and_then(|e| e.value.clone());
55 println!("after BackSpace: {value:?}");
56
57 computer.press_key(APP, "super+a")?;
58 let state = computer.get_app_state(APP, &tree_only)?;
59 println!("after super+a, selected: {:?}", state.selected_text);
60
61 let focused = ClickOptions::default().method(ClickMethod::FocusedBackground);
62 println!("focused click: {:?}", computer.click(APP, ClickTarget::Element(text_area), focused)?);
63 computer.type_text(APP, " The end.")?;
64 let state = computer.get_app_state(APP, &tree_only)?;
65 let value = state.find(&ElementQuery::role("AXTextArea")).next().and_then(|e| e.value.clone());
66 println!("final text: {value:?}");
67
68 Ok(())
69}Sourcepub fn element_at(&self, point: Point) -> Option<&Element>
pub fn element_at(&self, point: Point) -> Option<&Element>
The deepest element whose frame contains the screen point, preferring actionable ones.
Sourcepub fn render(&self) -> String
pub fn render(&self) -> String
Renders the state as compact, human-readable text (also handy as language-model input).
Each element is one tab-indented line beginning with its index:
App=com.apple.TextEdit (pid 812)
Window: "Untitled", App: TextEdit.
0 standard window Untitled
1 text area (focused, settable, editable) Value: Hello
2 button Close Secondary Actions: Show MenuTrait Implementations§
Auto Trait Implementations§
impl Forget for AppState
impl Freeze for AppState
impl RefUnwindSafe for AppState
impl Send for AppState
impl Sync for AppState
impl Unpin for AppState
impl UnsafeUnpin for AppState
impl UnwindSafe for AppState
Blanket Implementations§
impl<T> AutoreleaseSafe for Twhere
T: ?Sized,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more