#path #utoipa #openapi #swagger #auto #file-path #macro-derive

utoipauto-core

Rust宏,用于自动向Utoipa包添加Paths/Schemas,在编译阶段模拟反射

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 过程宏

Download history 648/week @ 2024-04-15 522/week @ 2024-04-22 585/week @ 2024-04-29 563/week @ 2024-05-06 822/week @ 2024-05-13 874/week @ 2024-05-20 687/week @ 2024-05-27 1459/week @ 2024-06-03 1766/week @ 2024-06-10 1751/week @ 2024-06-17 2280/week @ 2024-06-24 2404/week @ 2024-07-01 1936/week @ 2024-07-08 1371/week @ 2024-07-15 1833/week @ 2024-07-22 1834/week @ 2024-07-29

7,227每月下载量
用于2个包(通过utoipauto-macro

MIT/Apache

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(...)] 宏的方法,以及所有继承自 ToSchemaToResponse 的结构体。以下是如何添加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