foru_ms_sdk 0.0.40

SDK for the Foru.ms API
Documentation
# Foru.ms Rust Library

![](https://foru.ms/images/cover.png)

[![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen)](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=https%3A%2F%2Fgithub.com%2Fforu-ms%2Frust-sdk)
[![crates.io shield](https://img.shields.io/crates/v/foru_ms_sdk)](https://crates.io/crates/foru_ms_sdk)

The Foru.ms Rust library provides convenient access to the Foru.ms APIs from Rust.

## Table of Contents

- [Documentation]#documentation
- [Installation]#installation
- [Reference]#reference
- [Usage]#usage
- [Errors]#errors
- [Request Types]#request-types
- [Advanced]#advanced
  - [Retries]#retries
  - [Timeouts]#timeouts
  - [Additional Headers]#additional-headers
  - [Additional Query String Parameters]#additional-query-string-parameters

## Documentation

API reference documentation is available [here](https://foru.ms/docs/api-reference).

## Installation

Add this to your `Cargo.toml`:

```toml
[dependencies]
foru_ms_sdk = "0.0.40"
```

Or install via cargo:

```sh
cargo add foru_ms_sdk
```

## Reference

A full reference for this library is available [here](https://github.com/foru-ms/rust-sdk/blob/HEAD/./reference.md).

## Usage

Instantiate and use the client with the following:

```rust
use foru_ms_sdk::prelude::*;

#[tokio::main]
async fn main() {
    let config = ClientConfig {
        api_key: Some("<value>".to_string()),
        ..Default::default()
    };
    let client = ForumClient::new(config).expect("Failed to build client");
    client
        .auth
        .register(
            &PostAuthRegisterRequest {
                username: "username".to_string(),
                email: "email".to_string(),
                password: "password".to_string(),
                display_name: None,
                roles: None,
                bio: None,
                extended_data: None,
            },
            None,
        )
        .await;
}
```

## Errors

When the API returns a non-success status code (4xx or 5xx response), an error will be returned.

```rust
match client.auth.register(None)?.await {
    Ok(response) => {
        println!("Success: {:?}", response);
    },
    Err(ApiError::HTTP { status, message }) => {
        println!("API Error {}: {:?}", status, message);
    },
    Err(e) => {
        println!("Other error: {:?}", e);
    }
}
```

## Request Types

The SDK exports all request types as Rust structs. Simply import them from the crate to access them:

```rust
use foru_ms_sdk::prelude::{*};

let request = PostAuthRegisterRequest {
    ...
};
```

## Advanced

### Retries

The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long
as the request is deemed retryable and the number of retry attempts has not grown larger than the configured
retry limit (default: 2).

A request is deemed retryable when any of the following HTTP status codes is returned:

- [408]https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408 (Timeout)
- [429]https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429 (Too Many Requests)
- [5XX]https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500 (Internal Server Errors)

Use the `max_retries` method to configure this behavior.

```rust
let response = client.auth.register(
    Some(RequestOptions::new().max_retries(3))
)?.await;
```

### Timeouts

The SDK defaults to a 30 second timeout. Use the `timeout` method to configure this behavior.

```rust
let response = client.auth.register(
    Some(RequestOptions::new().timeout_seconds(30))
)?.await;
```

### Additional Headers

You can add custom headers to requests using `RequestOptions`.

```rust
let response = client.auth.register(
    Some(
        RequestOptions::new()
            .additional_header("X-Custom-Header", "custom-value")
            .additional_header("X-Another-Header", "another-value")
    )
)?
.await;
```

### Additional Query String Parameters

You can add custom query parameters to requests using `RequestOptions`.

```rust
let response = client.auth.register(
    Some(
        RequestOptions::new()
            .additional_query_param("filter", "active")
            .additional_query_param("sort", "desc")
    )
)?
.await;
```