rebind-client 0.2.0

Rust client for the Rebind remote access WebSocket protocol
Documentation
# rebind-client

Rust client for the [Rebind](https://rebind.gg) remote access WebSocket protocol.
Async, typed, built on tokio.

## Install

```toml
[dependencies]
rebind-client = "0.2"
```

## Quick start

```rust
use rebind_client::RebindClient;

#[tokio::main]
async fn main() -> rebind_client::Result<()> {
    let client = RebindClient::connect("ws://127.0.0.1:19561").await?;

    client.hid_move(30, -5);
    client.hid_press("Mouse1", 20);
    client.hid_type("hello\n");

    let (x, y) = client.system_mouse().await?;
    let pixel = client.screen_pixel(x, y).await?;
    println!("pixel at {x},{y} = rgb({},{},{})", pixel.r, pixel.g, pixel.b);

    let mut events = client.mouse_events().await?;
    while let Some(pos) = events.recv().await {
        println!("{} {}", pos.x, pos.y);
    }

    client.close().await;
    Ok(())
}
```

## Read input state

```rust
let keys = client.input_keys().await?;
let mods = client.input_modifiers().await?;
let shift_held = client.input_is_down("LShift").await?;
```

## Screen sampling

```rust
let (w, h) = {
    let res = client.screen_resolution().await?;
    (res.width, res.height)
};

// sample center pixel
let px = client.screen_pixel((w / 2) as i32, (h / 2) as i32).await?;

// react to a specific on-screen color (e.g. a UI state in a QA test)
if px.r > 200 && px.g < 50 && px.b < 50 {
    client.hid_press("Mouse1", 20);
}
```

## Window management

```rust
if let Some(handle) = client.window_find("Counter-Strike 2").await? {
    client.window_activate(handle).await?;
}
```

## Clipboard

```rust
let text = client.clipboard_get().await?;
client.clipboard_set("hello from rust").await?;
```

## Any server command

Commands without a typed method are reachable through `call`, which takes a
JSON object of arguments and returns the reply:

```rust
use serde_json::json;

let r = client.call("hash.sha256", json!({ "data": "hello" })).await?;
println!("{}", r["digest"]);
```

## Auth

```rust
let client = RebindClient::connect_with_token(
    "ws://127.0.0.1:19561",
    "my-secret",
).await?;
```

## Concurrent RPCs

The client is cheaply clonable via `Arc` for use across tasks:

```rust
use std::sync::Arc;

let client = Arc::new(RebindClient::connect("ws://127.0.0.1:19561").await?);

let c1 = client.clone();
let c2 = client.clone();

let (mouse, window) = tokio::join!(
    c1.system_mouse(),
    c2.system_window(),
);
```

## Links

- crates.io: [rebind-client]https://crates.io/crates/rebind-client
- GitHub: [usinput/rebind-client-rs]https://github.com/usinput/rebind-client-rs
- Docs: [docs.rebind.gg]https://docs.rebind.gg