#utoipa #path #openapi #auto #swagger

utoipa_auto_discovery

Rust宏,用于自动化将路径/模式添加到Utoipa包,在编译阶段模拟反射

2个不稳定版本

0.3.0 2023年6月5日
0.2.0 2023年6月4日
0.1.0 2023年6月4日

过程宏 中排名 #496

MIT/Apache

14KB
206

utoipa_auto_discovery

Rust宏,用于自动化将路径/模式添加到Utoipa包,在编译阶段模拟反射

MSRV

包介绍

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_auto_discovery 的目的是提出一个宏,用于自动检测携带Utoipa宏的方法(#[utoipa::path(...]),并自动将其添加。 (它也检测子模块。)

如何使用它

简单地将crate utoipa_auto_discovery 添加到项目中

cargo add utoipa_auto_discovery

导入宏

use utoipa_auto_discovery::utoipa_auto_discovery;

然后在 #[derive(OpenApi)] 和 #[openapi] 宏之前添加 #[utoipa_auto_discovery] 宏。

重要!!

#[utoipa_auto_discovery] 放在 #[derive(OpenApi)] 和 #[openapi] 宏之前。

#[utoipa_auto_discovery(paths = "( MODULE_TREE::MODULE_NAME => MODULE_SRC_FILE_PATH ) ; ( MODULE_TREE::MODULE_NAME => MODULE_SRC_FILE_PATH ) ; ... ;")]

路径接收一个必须遵守此结构的String

"( 模块树路径 => 模块源文件路径 ) ;"

您可以通过分号 ";" 分隔来添加多个对(模块路径 => 源路径)。

以下是如何添加test_controller和test2_controller模块中所有方法的示例。您还可以结合自动和手动添加,就像这里我们手动将方法添加到文档中 "other_controller::get_users"。

...

use utoipa_auto_discovery::utoipa_auto_discovery;

...
#[utoipa_auto_discovery(
  paths = "( crate::rest::test_controller => ./src/rest/test_controller.rs ) ; ( crate::rest::test2_controller => ./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;

...

排除自动扫描的方法

您可以通过添加以下宏来从Doc Path列表中排除一个函数:#[utoipa_ignore]

    /// 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::path标签的方法的子模块也会自动检测。

功能

  • 自动路径检测
  • 自动模式检测(进行中)

依赖关系

~265–710KB
~17K SLoC