19个版本
新增 0.1.14 | 2024年8月5日 |
---|---|
0.1.12 | 2024年7月2日 |
0.1.10 | 2024年3月7日 |
0.1.3 | 2023年12月8日 |
#1014 in 过程宏
7,227每月下载量
用于2个包(通过utoipauto-macro)
55KB
1K SLoC
utoipauto包的逻辑
此文件是utoipauto
包文档的一部分
Utoipauto
Rust宏,用于自动向Utoipa包添加Paths/Schemas,在编译阶段模拟反射
包介绍
Utoipa是一个通过源代码生成文档(openapi/swagger)的优秀包。
但是,由于Rust是一种静态编程语言,我们在运行时无法自动发现路径和DTO并将其添加到文档中,
对于只有少数端点的API,逐个添加控制器函数和DTO并不是什么大问题。
但是,如果你有数百甚至数千个端点,代码就会变得非常冗长且难以维护。
示例
#[derive(OpenApi)]
#[openapi(
paths(
// <================================ All functions 1 to N
test_controller::service::func_get_1,
test_controller::service::func_get_2,
test_controller::service::func_get_3,
test_controller::service::func_get_4,
....
....
....
test_controller::service::func_get_N,
),
components(
// <====================== All DTO one by one
schemas(TestDTO_1, TestDTO_2, ........ , TestDTO_N)
),
tags(
(name = "todo", description = "Todo management endpoints.")
),
modifiers(&SecurityAddon)
)]
pub struct ApiDoc;
此包的目标是提供一个宏,用于自动检测携带Utoipa宏的方法(#[utoipa::path(...]
),并自动添加它们。(它也检测子模块。)
它还检测用于components(schemas)
部分的派生自ToSchema
的结构,以及用于components(responses)
部分的ToResponse
。
特性
- 自动递归路径检测
- 自动从模块导入
- 自动从src文件夹导入
- 自动模型检测
- 自动响应检测
如何使用它
简单地将crate utoipauto
添加到项目中
cargo add utoipauto
导入宏
use utoipauto::utoipauto;
然后在 #[derive(OpenApi)] 和 #[openapi] 宏之前添加 #[utoipauto]
宏。
重要!!
将 #[utoipauto]
放在 #[derive(OpenApi)]
和 #[openapi]
宏之前。
#[utoipauto(paths = "MODULE_SRC_FILE_PATH, MODULE_SRC_FILE_PATH, ...")]
路径接收一个必须遵循此结构的String
"MODULE_SRC_FILE_PATH, MODULE_SRC_FILE_PATH, ..."
您可以通过逗号 ","
分隔来添加多个路径。
从src文件夹导入
如果没有指定路径,宏将自动扫描 src
文件夹,并添加所有带有 #[utoipa::path(...)]
宏的方法,以及所有继承自 ToSchema
和 ToResponse
的结构体。以下是如何添加src代码中所有方法的示例。
...
use utoipauto::utoipauto;
...
#[utoipauto]
#[derive(OpenApi)]
#[openapi(
tags(
(name = "todo", description = "Todo management endpoints.")
),
modifiers(&SecurityAddon)
)]
pub struct ApiDoc;
...
从模块导入
以下是如何添加其余模块中所有方法和结构的示例。
use utoipauto::utoipauto;
#[utoipauto(
paths = "./src/rest"
)]
#[derive(OpenApi)]
#[openapi(
tags(
(name = "todo", description = "Todo management endpoints.")
),
modifiers(&SecurityAddon)
)]
pub struct ApiDoc;
以下是如何在子文件夹中添加其余模块中所有方法和结构的示例。
use utoipauto::utoipauto;
#[utoipauto(
paths = "(./src/lib/rest from crate::rest)"
)]
#[derive(OpenApi)]
#[openapi(
tags(
(name = "todo", description = "Todo management endpoints.")
),
modifiers(&SecurityAddon)
)]
pub struct ApiDoc;
从文件名导入
以下是如何添加 test_controller 和 test2_controller 模块中所有方法的示例。您还可以将自动添加和手动添加结合起来,例如,我们在此手动添加了文档中的 "other_controller::get_users" 方法和一个模式 "TestDTO"。
use utoipauto::utoipauto;
#[utoipauto(
paths = "./src/rest/test_controller.rs,./src/rest/test2_controller.rs "
)]
#[derive(OpenApi)]
#[openapi(
paths(
crate::rest::other_controller::get_users,
),
components(
schemas(TestDTO)
),
tags(
(name = "todo", description = "Todo management endpoints.")
),
modifiers(&SecurityAddon)
)]
pub struct ApiDoc;
排除自动扫描的方法
您可以通过添加以下宏 #[utoipa_ignore]
来排除Doc Path列表中的一个函数。
示例
/// Get all pets from database
///
#[utoipa_ignore] //<============== this Macro
#[utoipa::path(
responses(
(status = 200, description = "List all Pets", body = [ListPetsDTO])
)
)]
#[get("/pets")]
async fn get_all_pets(req: HttpRequest, store: web::Data<AppState>) -> impl Responder {
// your CODE
}
排除自动扫描的结构
您还可以通过添加以下宏 #[utoipa_ignore]
来排除模型和响应列表中的一个结构。
示例
#[utoipa_ignore] //<============== this Macro
#[derive(ToSchema)]
struct ModelToIgnore {
// your CODE
}
注意
包含带有 utoipa::path 标记的方法的子模块也自动检测。
贡献
欢迎贡献,请随意提交PR或问题。
依赖关系
~280–730KB
~17K SLoC