15个版本
0.1.14 | 2024年8月5日 |
---|---|
0.1.12 | 2024年7月2日 |
0.1.11 | 2024年6月5日 |
0.1.10 | 2024年3月7日 |
0.0.1 | 2023年12月1日 |
#44 in 过程宏
每月下载量:7,647
12KB
Utoipauto
Rust宏,用于在编译阶段自动添加Paths/Schemas到Utoipa包,模拟反射
包介绍
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(...]
),并自动将其添加。 (它还会检测子模块。)
它还会检测为ToSchema
继承或实现的struct,用于components(schemas)
部分,以及用于components(responses)
部分的ToResponse
。
特性
- 自动递归路径检测
- 自动从模块导入
- 自动从src文件夹导入
- 自动模型检测
- 自动响应检测
- 与工作区兼容
- 从自动扫描中排除方法
- 自定义路径检测
如何使用
只需将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, ..."
您可以通过逗号","
分隔它们以添加多个路径。
支持泛型模式
我们支持泛型模式,但有一些缺点。
如果您想使用泛型,您有三种方式可以做到。
- 使用完整路径
#[aliases(GenericSchema = path::to::Generic<path::to::Schema>)]
- 导入utoipauto所在的位置
use path::to::schema;
- 使用
generic_full_path
功能
请注意,此功能会导致更多的构建时间开销。
更高的RAM使用量、更长的编译时间和过度的磁盘使用量(尤其是在大型项目中)是后果。
utoipauto = { version = "*", feature = ["generic_full_path"] }
与工作空间一起使用
如果您正在使用工作空间,您必须在路径中指定crate的名称。
即使您在同一个crate中使用#[utoipauto]
,这也适用。
#[utoipauto(paths = "./utoipauto/src")]
您可以使用from键指定指定的路径来自另一个crate。
#[utoipauto(paths = "./utoipauto/src from utoipauto")]
从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;
...
从模块导入
以下是如何添加rest模块中包含的所有方法和结构的示例。
use utoipauto::utoipauto;
#[utoipauto(
paths = "./src/rest"
)]
#[derive(OpenApi)]
#[openapi(
tags(
(name = "todo", description = "Todo management endpoints.")
),
modifiers(&SecurityAddon)
)]
pub struct ApiDoc;
以下是如何添加位于子文件夹中的rest模块中包含的所有方法和结构的示例
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(...)]
属性的函数,但您也可以指定要查找的自定义属性。
#[handler]
pub fn custom_router() {
// ...
}
#[utoipauto(function_attribute_name = "handler")] //Custom attribute
#[derive(OpenApi)]
#[openapi(tags()))]
pub struct ApiDoc;
您还可以指定模型和响应检测的自定义属性。
#[derive(Schema, Response)]
pub struct CustomModel {
// ...
}
#[utoipauto(schema_attribute_name = "Schema", response_attribute_name = "Response")] //Custom derive
#[derive(OpenApi)]
#[openapi(tags())]
pub struct ApiDoc;
注意
包含带有 utoipa::path 标记的方法的模块中的子模块也将自动检测。
贡献
欢迎贡献,请随意提交 PR 或问题。
灵感来源
灵感来源于 utoipa_auto_discovery
依赖项
~310–760KB
~18K SLoC