# XamiLib Rust — Instalación

**XamiLib para Rust** (`xamisdk_client`) es la librería que permite a tu aplicación
Rust firmar a través del servicio local del xamiSDK. Tu aplicación habla con el
servicio local (nunca con Xami directamente); el documento no sale de tu red.

A diferencia del resto de librerías de esta suite (Node, Ruby, Go, .NET, Java — todas
sin dependencias externas, solo su stdlib), Rust no trae cliente HTTP ni JSON de
fábrica. XamiLib Rust usa `ureq` (cliente HTTP bloqueante, sin runtime async),
`serde_json` (para las respuestas, como tipo genérico `Value`) y `base64` (para el PDF
en `pdf_base64`).

## Requisitos

- Rust 1.70 o superior (`cargo`).
- El servidor xamiSDK instalado, pareado y corriendo (`xamisdk serve`).
- Una credencial de aplicación (`xamisdk wrapper:create --name mi-app`), que te da un
  `wrapper_key` y un `wrapper_secret`.

## Instalación

Descarga el paquete desde https://sdk.xami.run/files/xamisdk-rust-0.1.0.zip,
descomprímelo junto a tu proyecto y agrégalo como dependencia de ruta en tu
`Cargo.toml`:

```bash
curl -O https://sdk.xami.run/files/xamisdk-rust-0.1.0.zip
unzip xamisdk-rust-0.1.0.zip
```

```toml
[dependencies]
xamisdk_client = { path = "./xamisdk-rust" }
```

> **Toolchain viejo (p. ej. el `cargo` 1.75 que trae Ubuntu 24.04 por `apt`):**
> si `cargo build` falla porque `idna_adapter` (dependencia transitiva de `ureq`, vía
> `url`) pide la feature `edition2024`, fija versiones más viejas en tu `Cargo.toml`:
> ```toml
> url = "=2.4.1"
> idna = "=0.4.0"
> ureq = { version = "=2.9.7", default-features = false, features = ["json"] }
> ```
> Con un toolchain reciente no hace falta tocar nada.

## Primer uso

```rust
use xamisdk_client::{Config, XamiSDK};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let xami = XamiSDK::new(Config {
        endpoint: "http://127.0.0.1:8300".to_string(),
        wrapper_key: "wrp_...".to_string(),
        wrapper_secret: "wsec_...".to_string(),
        ..Default::default()
    });

    let estado = xami.health().get_self()?;
    println!("{}", if estado["paired"].as_bool().unwrap_or(false) { "pareado" } else { "sin parear" });
    Ok(())
}
```
