rustymilky 0.1.0

Milky 协议的 Rust SDK
Documentation
# rustymilky

Milky 的 Rust SDK,提供类型安全的 API 调用和事件流支持。

## 安装

```bash
cargo add rustymilky
cargo add futures-util anyhow
cargo add tokio --features full
```

## 使用方法

下面是一个使用 `MilkyClient` 创建客户端并调用 API 的示例:

```rust,no_run
use anyhow::Result;
use rustymilky::{
  MilkyClient,
  protocol::GetLoginInfoInput,
};

#[tokio::main]
async fn main() -> Result<()> {
  let client = MilkyClient::new("http://127.0.0.1:3100", Some("token"))?;

  let login = client.request(GetLoginInfoInput {}).await?;
  println!("{} ({})", login.nickname, login.uin);

  Ok(())
}
```

### 监听事件

通过 `client.event(...)`、`client.event_ws()` 或 `client.event_sse()` 可以创建事件连接,支持 WebSocket 和 SSE 两种方式。

```rust,no_run
use anyhow::Result;
use futures_util::StreamExt;
use rustymilky::{
  MilkyClient,
  MilkyTransportEvent,
  MilkyTransportKind,
  protocol::Event,
};

#[tokio::main]
async fn main() -> Result<()> {
  let client = MilkyClient::new("http://127.0.0.1:3100", None)?;
  let mut source = client.event(MilkyTransportKind::WebSocket).await?;

  while let Some(event) = source.next().await {
    match event? {
      MilkyTransportEvent::Open => {
        println!("connected");
      }
      MilkyTransportEvent::Reconnecting {
        attempt,
        next_delay,
      } => {
        println!("reconnecting: attempt {}, waiting {:?}", attempt, next_delay);
      }
      MilkyTransportEvent::Reconnected => {
        println!("reconnected");
      }
      MilkyTransportEvent::Push(Event::BotOffline { .. }) => {
        println!("bot offline");
        source.close();
      }
      MilkyTransportEvent::Push(event) => {
        println!("{:?}", event);
      }
    }
  }

  Ok(())
}
```

### 重试配置

`MilkyClientConfig` 允许分别配置 API 请求和事件流重连的重试策略,策略类型由 `RetryOptions` 表示。

```rust,no_run
use std::time::Duration;
use anyhow::Result;

use rustymilky::{
  MilkyClient,
  MilkyClientConfig,
  RetryOptions,
};

fn main() -> Result<()> {
  let client = MilkyClient::with_config(
    "http://127.0.0.1:3100",
    None,
    MilkyClientConfig {
      event_reconnect: RetryOptions::Exponential {
        initial_delay: Duration::from_millis(500),
        factor: 2.0,
        max_delay: Some(Duration::from_secs(10)),
        max_retries: None,
      },
      request_retry: RetryOptions::Constant {
        delay: Duration::from_millis(200),
        max_retries: Some(3),
      },
    },
  )?;

  let _ = client;
  Ok(())
}
```