| Crates.io | anycms-core |
| lib.rs | anycms-core |
| version | 0.4.0 |
| created_at | 2025-12-28 08:28:35.168692+00 |
| updated_at | 2026-01-18 08:43:49.246777+00 |
| description | A unified API response library supporting multiple Rust web frameworks |
| homepage | |
| repository | |
| max_upload_size | |
| id | 2008413 |
| size | 120,209 |
支持多种 Rust Web 框架的统一 API 响应库。
ApiResult<T> 结构独立于任何 Web 框架工作在 Cargo.toml 中添加:
[dependencies]
anycms-core = "0.3"
actix (默认):启用 actix-web 集成axum:启用 axum 集成full:启用所有框架集成# 默认(仅 actix-web)
anycms-core = "0.3"
# 仅 axum
anycms-core = { version = "0.3", features = ["axum"] }
# 两个框架都启用
anycms-core = { version = "0.3", features = ["full"] }
src/
├── lib.rs # 库入口,带 feature 条件导出
├── result.rs # 核心 ApiResult<T> 定义(框架无关)
├── pagination.rs # 分页元数据结构
└── frameworks/
├── mod.rs # 框架模块声明
├── actix.rs # actix-web 集成 (Responder trait)
└── axum.rs # axum 集成 (IntoResponse trait)
该库采用清晰的关注点分离设计:
核心层 (result.rs, pagination.rs)
框架层 (frameworks/)
use actix_web::{get, web};
use anycms_core::{ApiResult, ResultPagination};
#[get("/users")]
async fn list_users() -> ApiResult<User> {
let users = fetch_users().await;
let pagination = ResultPagination::new(100, 1, 10);
ApiResult::list(users)
.with_pagination(pagination)
.with_extra("has_more", serde_json::json!(true))
}
use axum::{extract::Json, routing::get};
use anycms_core::{ApiResult, ResultPagination};
async fn list_users() -> ApiResult<User> {
let users = fetch_users().await;
let pagination = ResultPagination::new(100, 1, 10);
ApiResult::list(users)
.with_pagination(pagination)
.with_extra("has_more", serde_json::json!(true))
}
运行演示示例:
# Actix-web 演示
cargo run --example actix_demo --features actix
# Axum 演示
cargo run --example axum_demo --features axum
# 检查示例
cargo check --examples --all-features
该库使用统一的 data 字段来处理单值和列表响应:
{
"success": true,
"data": { "id": 1, "name": "张三" }
}
{
"success": true,
"data": [
{ "id": 1, "name": "张三" },
{ "id": 2, "name": "李四" }
],
"pagination": {
"total": 100,
"page": 1,
"pageSize": 10,
"currentPage": 1
}
}
{
"success": true
}
{
"success": false,
"message": "用户不存在",
"code": 404
}
data 字段:单值和列表都使用 data 字段,通过 ResponseData<T> 枚举在类型层面区分Array.isArray(data) 即可区分类型MIT