opgg 0.1.0

Rust asynchronous client for accessing the hero statistics API provided by [OP.GG](https://op.gg).
Documentation
# opgg

Rust 异步客户端,用于访问 [OP.GG](https://op.gg) 提供的英雄统计 API。

crate 封装了常见的接口(英雄元信息、英雄列表、英雄详情),并提供结构化的返回类型,方便在命令行工具、后端服务或数据分析管道中复用。

---

## 特性

- **异步请求**:基于 `reqwest``tokio`,默认使用 `rustls` TLS 实现。
- **类型安全**:将主要响应字段(如英雄角色、位置、趋势数据等)映射为 Rust 结构体/枚举,减少序列化/反序列化开销。
- **输入校验**:在请求前校验 `GameMode``ChampionPosition` 的组合是否合法,防止无效调用。
- **轻量依赖**:仅依赖核心网络与序列化库,适合嵌入到现有项目中。

## 快速开始

在你的 `Cargo.toml` 中加入:

```toml
[dependencies]
opgg = "*"
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
```

示例程序:

```rust
use opgg::{ChampionPosition, Client, GameMode};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();

    let meta = client.champion_meta().await?;
    println!("meta version: {}", meta.meta.version);

    let ranked_list = client.champion_list(GameMode::Ranked).await?;
    println!("ranked champions: {}", ranked_list.data.len());

    let info = client
        .champion_info(GameMode::Ranked, 202, ChampionPosition::Top)
        .await?;
    println!("{}", info.data.summary.average_stats.kda);

    Ok(())
}
```

使用默认构造即可直接访问线上 API;如需自定义 HTTP 客户端(代理、超时等),可通过 `Client::builder()` 自行配置并注入。

## API 概览

- `Client::champion_meta()`:获取当前数据版本与全局元信息。
- `Client::champion_list(mode)`:返回指定模式下的英雄概览 `Response<Vec<Summary>>`,其中 `Summary` 包含平均胜率、常用位置等字段。
- `Client::champion_info(mode, champion_id, position)`:获取特定模式、英雄与位置的详细数据 `Response<Info>`,包括常用出装、符文、技能加点及趋势。

所有接口都会在查询字符串中自动附带 `hl=zh_CN`,获取中文环境下的数据。

### 枚举与数据结构

- `GameMode`:目前支持 `Aram``Ranked`,并提供 `allows_position` 方法用于校验位置是否合法。
- `ChampionPosition`:涵盖 `Top/Mid/Jungle/Support/ADC/None`,用于指定英雄在某模式下的分路。
- `champion` 模块:定义了 `Meta``Summary``Info``Role``Item``Rune` 等结构体,可直接访问响应中的细粒度数据。
- `Error`:统一错误类型,覆盖 URL 构造、HTTP 错误与模式/位置组合错误。

更多字段定义可查看 `src/champion.rs`。

## 测试

仓库提供了一个实时集成测试 `tests/client_live.rs`,用于验证端点是否可用:

```bash
cargo test -- --nocapture
```

> ⚠️ 该测试会直接请求线上 OP.GG API,需要能够访问外网。运行前请确认网络状况及频率限制,避免触发风控。

如果你只需要验证编译是否通过,可使用:

```bash
cargo test --no-run
```

## 开发指南

- `Client::builder()` 返回 `reqwest::ClientBuilder`,可在此配置代理、超时、连接池等设置。
- 如需扩展更多接口,建议参考 `client.rs` 中的 `get` 辅助方法,并复用 `Response<T>` 类型作为统一响应包装。
- 新增字段时,请同步更新 `champion` 模块下相关结构体,确保序列化标签 (`serde` 属性) 与字段名称保持一致。

## 许可证

本项目采用 [MIT](LICENSE) 许可证,欢迎在遵循许可条款的前提下自由使用与贡献。