nils-macos-agent 0.4.7

CLI crate for nils-macos-agent in the nils-cli workspace.
Documentation
use crate::backend::process::{ProcessRequest, ProcessRunner, map_failure};
use crate::cli::MouseButton;
use crate::error::CliError;

pub fn click(
    runner: &dyn ProcessRunner,
    x: i32,
    y: i32,
    button: MouseButton,
    count: u8,
    timeout_ms: u64,
) -> Result<(), CliError> {
    if count == 0 {
        return Err(CliError::usage("--count must be at least 1"));
    }

    let action = match button {
        MouseButton::Left => "c",
        MouseButton::Right => "rc",
        MouseButton::Middle => "mc",
    };

    let mut args = Vec::with_capacity(count as usize);
    for _ in 0..count {
        args.push(format!("{action}:{x},{y}"));
    }

    let request = ProcessRequest::new("cliclick", args, timeout_ms.max(1));
    runner
        .run(&request)
        .map(|_| ())
        .map_err(|failure| map_failure("input.click", failure))
}

pub fn button_name(button: MouseButton) -> &'static str {
    match button {
        MouseButton::Left => "left",
        MouseButton::Right => "right",
        MouseButton::Middle => "middle",
    }
}

#[cfg(test)]
mod tests {
    use super::button_name;
    use crate::cli::MouseButton;

    #[test]
    fn maps_button_name() {
        assert_eq!(button_name(MouseButton::Left), "left");
        assert_eq!(button_name(MouseButton::Right), "right");
        assert_eq!(button_name(MouseButton::Middle), "middle");
    }
}