# 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(())
}
```