qmp 0.1.1

QEMU QMP client library
Documentation
# qmp

**QEMU QMP** client library.

Goals:

- **Pure Rust**, async-first.
- **Unix/TCP** socket support.
- Correct **greeting + `qmp_capabilities`** negotiation.
- JSON request/response encoding/decoding with **serde**.
- **Event stream** (subscribe, multi-consumer).
- Command calls with **timeout** and cooperative **cancellation**.
- Optional, higher-level **safe ops** layer:
  - allow-list policies (white-list)
  - per-command mutex / idempotency
  - retry/backoff with jitter
  - structured errors
  - (optional) `tracing` observability

## Quick start

### Low-level client

```rust
use qmp::{Client, Endpoint};

# async fn demo() -> qmp::Result<()> {
let client = Client::connect(Endpoint::unix("/var/run/qemu-server/100.qmp")).await?;

let status: serde_json::Value = client.execute("query-status", Option::<()>::None).await?;
println!("status = {status}");

let mut events = client.events();
while let Ok(ev) = events.recv().await {
    println!("event: {} data={}", ev.name, ev.data);
}
# Ok(()) }
```

### Safe ops layer

```rust
use qmp::{Client, Endpoint};
use qmp::ops::{OpsClient, Profile};

# async fn demo() -> qmp::Result<()> {
let client = Client::connect(Endpoint::unix("/var/run/qemu-server/100.qmp")).await?;

// Read-only allow-list by default.
let ops = OpsClient::from_profile(client, Profile::ReadOnly);

let v = ops.query_version().await?;
println!("qemu {}.{}.{} ({})", v.qemu.major, v.qemu.minor, v.qemu.micro, v.package);
# Ok(()) }
```