nubis-sdk 1.2.0

Official Nubis Rust SDK
Documentation
# Nubis Rust SDK

Official Rust SDK for Nubis.

Designed for backend services and platform automation that need:

- broad API coverage with generated endpoint methods
- explicit request control (method, path params, query, body)
- consistent error types for production monitoring and retries

## Install

From crates.io:

```toml
[dependencies]
nubis-sdk = "1.2"
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
serde_json = "1"
```

For local development:

```toml
[dependencies]
nubis-sdk = { path = "../nubis-core/sdk-rust" }
```

## Quick Start

```rust
use nubis_sdk::NubisClient;
use serde_json::json;

#[tokio::main]
async fn main() -> Result<(), nubis_sdk::NubisError> {
    let client = NubisClient::builder()
        .base_url("https://nubis-core.onrender.com")
        .api_key("your_api_key")
        .build()?;

    let orgs = client.get_api_v1_orgs(None).await?;
    println!("orgs: {orgs}");

    let payload = json!({ "name": "acme", "slug": "acme" });
    let created = client.post_api_v1_orgs(Some(&payload), None).await?;
    println!("created: {created}");

    Ok(())
}
```

## How Endpoint Methods Are Named

Endpoint methods are generated from backend routes and follow:

`<http_method>_<normalized_path>`

Examples:

- `GET /api/v1/orgs` -> `get_api_v1_orgs(...)`
- `POST /api/v1/orgs/:org_id/projects` -> `post_api_v1_orgs_by_org_id_projects(...)`

Path params become function arguments in order. Query/body are passed explicitly.

## Calling Patterns

Read-style routes:

```rust
let data = client
    .get_api_v1_projects_by_project_id("proj_123", None)
    .await?;
```

Write-style routes:

```rust
let payload = serde_json::json!({ "name": "new-name" });
let data = client
    .post_api_v1_orgs(Some(&payload), None)
    .await?;
```

With query params:

```rust
let query = [("range_minutes", "60")];
let metrics = client
    .get_api_v1_orgs_by_org_id_metrics_compute("org_123", Some(&query))
    .await?;
```

## Error Handling

All SDK errors use `NubisError`:

- `NubisError::Transport(reqwest::Error)`
- `NubisError::Serialization(serde_json::Error)`
- `NubisError::Http { status, message, body }`

```rust
match client.get_api_v1_orgs(None).await {
    Ok(data) => println!("{data}"),
    Err(nubis_sdk::NubisError::Http { status, message, .. }) => {
        eprintln!("request failed: {status} - {message}");
    }
    Err(err) => eprintln!("sdk error: {err}"),
}
```

## What Is Generated

- Route methods are generated from:
  - `services/api-gateway/src/main.rs`
- Generated output file:
  - `src/generated/endpoints.rs`

This ensures coverage keeps pace with backend route additions.

## Regeneration Workflow

Run this after route changes:

```bash
python scripts/generate_sdk_rust.py
cargo fmt
cargo check
```

## Publishing to crates.io

1. Update `version` in `Cargo.toml`
2. Validate package:
   `cargo publish --dry-run`
3. Publish:
   `cargo publish`
4. Verify:
   [crates.io/nubis-sdk]https://crates.io/crates/nubis-sdk

## License

MIT. See [LICENSE.md](./LICENSE.md).

## Related SDK

Need JavaScript or TypeScript? See:

- `../sdk-js/README.md`