use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct Point {
pub x: f64,
pub y: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MouseButton {
Left,
Right,
Middle,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Key(pub String);
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Intent {
pub name: String,
#[serde(default)]
pub params: BTreeMap<String, crate::value::Value>,
}
impl Intent {
pub fn new(name: impl Into<String>) -> Self {
Intent {
name: name.into(),
params: BTreeMap::new(),
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "op", rename_all = "snake_case")]
pub enum InputCommand {
MoveTo { to: Point },
Click { at: Point, button: MouseButton },
KeyPress { key: Key },
KeyDown { key: Key },
KeyUp { key: Key },
Scroll { at: Point, delta: i32 },
Wait { ms: u64 },
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "outcome", rename_all = "snake_case")]
pub enum ActionOutcome {
Succeeded,
Failed {
reason: String,
},
Rejected {
reason: String,
},
Aborted,
TimedOut {
after_ms: u64,
},
}
impl ActionOutcome {
pub fn is_success(&self) -> bool {
matches!(self, ActionOutcome::Succeeded)
}
}