bark_rs 0.1.0

A Rust client for bark.day.app
Documentation
# Bark Rust 客户端

一个功能完整的 Bark 推送服务 Rust 客户端库,采用清晰的模块化设计,支持所有官方 API 参数。

## 🏗️ 架构设计

### 三层架构
1. **消息构建层** (`BarkMessage`) - 统一的消息构建,同步异步通用
2. **同步客户端** (`SyncBarkClient`) - 专门处理同步发送,零运行时依赖
3. **异步客户端** (`AsyncBarkClient`) - 专门处理异步发送,可选功能

### 设计优势
- 🧩 **模块分离**: 消息构建与发送客户端完全分离
- 🔄 **灵活复用**: 同一个消息可以用不同客户端发送
- 📦 **按需引入**: tokio 是可选依赖,只在需要异步功能时引入
- 🚫 **无冲突**: 同步和异步客户端各司其职,不会相互干扰

## 功能特性

- 🚀 **默认同步** - 无需外部运行时,开箱即用
-**可选异步** - 通过 feature 启用异步功能
- 🛠️ **Builder 模式** - 链式调用,易于使用
- 📱 **完整 API 支持** - 支持所有 Bark API 参数
- 🔄 **批量推送** - 支持向多个设备同时发送
- 🛡️ **完整错误处理** - 详细的错误类型和处理
-**全面测试** - 包含完整的测试用例

## 安装

```toml
[dependencies]
# 只使用同步功能(默认)
bark_rs = "0.1.0"

# 启用异步功能
bark_rs = { version = "0.1.0", features = ["async"] }
```

## 快速开始

### 同步使用(推荐)

```rust
use bark_rs::{SyncBarkClient, Level};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建同步客户端
    let client = SyncBarkClient::with_device_key("https://api.day.app", "your_device_key");

    // 发送推送
    let response = client
        .message()
        .title("测试标题")
        .body("这是一个测试消息")
        .send()?;

    println!("推送成功: {}", response.message);
    Ok(())
}
```

### 异步使用

```rust
// Cargo.toml: bark_rs = { version = "0.1.0", features = ["async"] }
use bark_rs::{AsyncBarkClient, Level};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = AsyncBarkClient::with_device_key("https://api.day.app", "your_device_key");

    let response = client
        .message()
        .title("异步测试")
        .body("这是一个异步消息")
        .send()
        .await?;

    println!("异步推送成功: {}", response.message);
    Ok(())
}
```

### 消息构建与发送分离

```rust
use bark_rs::{SyncBarkClient, BarkMessage, Level};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 构建消息(与发送客户端无关)
    let message = BarkMessage::builder()
        .title("独立消息")
        .body("消息构建与发送完全分离")
        .level(Level::Critical)
        .sound("alarm")
        .badge(1)
        .build();

    // 创建同步客户端并发送
    let sync_client = SyncBarkClient::with_device_key("https://api.day.app", "your_key");
    let response = sync_client.send(&message)?;
    
    println!("发送成功: {}", response.message);
    Ok(())
}
```

## 高级功能

### 完整参数演示

```rust
use bark_rs::{SyncBarkClient, Level};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = SyncBarkClient::with_device_key("https://api.day.app", "your_device_key");

    let response = client
        .message()
        .title("重要通知")
        .subtitle("系统警告")
        .body("服务器负载过高,请立即检查!")
        .level(Level::Critical)           // 重要警告级别
        .volume(10)                       // 最大音量
        .badge(1)                         // 应用角标
        .call(true)                       // 重复播放铃声
        .auto_copy(true)                  // 自动复制内容
        .sound("alarm")                   // 警报铃声
        .icon("https://example.com/alert.png") // 自定义图标
        .group("系统监控")                 // 消息分组
        .is_archive(true)                 // 保存到历史
        .url("https://monitor.example.com") // 点击跳转链接
        .id("server_alert_001")           // 消息ID
        .send()?;

    println!("推送成功: {}", response.message);
    Ok(())
}
```

### 批量推送

```rust
let response = client
    .message()
    .device_keys(vec![
        "device_key_1".to_string(),
        "device_key_2".to_string(),
        "device_key_3".to_string(),
    ])
    .title("批量通知")
    .body("这是一个发送给多个设备的消息")
    .level(Level::TimeSensitive)
    .send()?;
```

### 混合使用场景

```rust
use bark_rs::{SyncBarkClient, AsyncBarkClient, BarkMessage, Level};

// 构建一个消息
let message = BarkMessage::builder()
    .title("共享消息")
    .body("这个消息可以被不同客户端使用")
    .level(Level::Active)
    .build();

// 同步发送
let sync_client = SyncBarkClient::new("https://api.day.app");
sync_client.send(&message)?;

// 异步发送(需要 async feature)
#[cfg(feature = "async")]
{
    let async_client = AsyncBarkClient::new("https://api.day.app");
    async_client.send(&message).await?;
}
```

## API 参考

### 客户端类型

- `SyncBarkClient` - 同步客户端,默认可用
- `AsyncBarkClient` - 异步客户端,需要 `async` feature

### 消息构建

- `BarkMessage::builder()` - 创建消息构建器
- `BarkMessage::new()` - 同上,别名方法

### 支持的参数

- **基础参数**: title, subtitle, body, device_key, device_keys
- **通知级别**: level (critical/active/timeSensitive/passive)
- **音效控制**: volume, badge, call, sound
- **复制功能**: autoCopy, copy
- **外观定制**: icon, group
- **行为控制**: isArchive, url, action
- **消息管理**: id, delete
- **加密支持**: ciphertext

## 错误处理

```rust
use bark_rs::{SyncBarkClient, BarkError};

match client.message().body("测试").send() {
    Ok(response) => println!("成功: {}", response.message),
    Err(BarkError::RequestError(e)) => println!("网络错误: {}", e),
    Err(BarkError::MissingDeviceKey) => println!("缺少设备密钥"),
    Err(BarkError::InvalidUrl) => println!("无效的URL"),
    Err(BarkError::SerializationError(e)) => println!("序列化错误: {}", e),
}
```

## 运行示例

```bash
# 同步示例
cargo run --example sync_client
cargo run --example message_builder
cargo run --example batch_push
cargo run --example error_handling

# 异步示例(需要 async feature)
cargo run --features async --example async_client

# 混合使用
cargo run --features async --example mixed_usage
```

## Features

- `async` - 启用异步功能和 `AsyncBarkClient`

## 测试

```bash
# 测试同步功能
cargo test

# 测试异步功能
cargo test --features async
```

## 设计理念

这个库遵循以下设计原则:

1. **关注点分离**: 消息构建与发送逻辑完全分离
2. **按需引入**: 异步功能是可选的,不强制依赖 tokio
3. **类型安全**: 编译时确保参数正确性
4. **易于使用**: Builder 模式提供良好的开发体验
5. **灵活扩展**: 模块化设计便于未来功能扩展

## 通知级别说明

- `Level::Critical`: 重要警告,在静音模式下也会响铃
- `Level::Active`: 默认值,系统会立即亮屏显示通知
- `Level::TimeSensitive`: 时效性通知,可在专注状态下显示
- `Level::Passive`: 仅添加到通知列表,不会亮屏提醒

## 许可证

MIT License