#axum #openapi #swagger #proc-macro #rust

okapi-operation-macro

okapi-operation 的宏实现

6 个版本

0.2.0 2024 年 8 月 7 日
0.1.4 2024 年 7 月 18 日
0.1.3 2023 年 4 月 29 日
0.1.2 2023 年 3 月 7 日
0.1.0 2022 年 7 月 10 日

#49 in #swagger

Download history 773/week @ 2024-04-26 517/week @ 2024-05-03 968/week @ 2024-05-10 1224/week @ 2024-05-17 905/week @ 2024-05-24 696/week @ 2024-05-31 696/week @ 2024-06-07 901/week @ 2024-06-14 1067/week @ 2024-06-21 921/week @ 2024-06-28 647/week @ 2024-07-05 846/week @ 2024-07-12 1406/week @ 2024-07-19 1054/week @ 2024-07-26 1422/week @ 2024-08-02 1295/week @ 2024-08-09

5,473 每月下载量
okapi-operation 中使用

MIT 许可证

47KB
1K SLoC

okapi-operation

Crates.io docs.rs CI

这是一个库,允许使用过程宏(使用来自 okapi 包的类型)生成 OpenAPI 的操作定义。

示例(带有 axum-integration 功能)。

use axum::{extract::Query, Json};
use okapi_operation::{axum_integration::*, *};
use serde::Deserialize;

#[derive(Deserialize, JsonSchema)]
struct Request {
    /// Echo data
    data: String,
}

#[openapi(
    summary = "Echo using GET request",
    operation_id = "echo_get",
    tags = "echo",
    parameters(
        query(name = "echo-data", required = true, schema = "std::string::String",),
        header(name = "x-request-id", schema = "std::string::String",)
    )
)]
async fn echo_get(query: Query<Request>) -> Json<String> {
    Json(query.0.data)
}

#[openapi(
    summary = "Echo using POST request",
    operation_id = "echo_post",
    tags = "echo"
)]
async fn echo_post(
    #[body(description = "Echo data", required = true)] body: Json<Request>,
) -> Json<String> {
    Json(body.0.data)
}

fn main() {
    let app = Router::new()
        .route("/echo/get", get(openapi_handler!(echo_get)))
        .route("/echo/post", post(openapi_handler!(echo_post)))
        .finish_openapi("/openapi", "Demo", "1.0.0")
        .expect("no problem");
    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    axum::serve(listener, app.into_make_service()).await.unwrap()
}

功能

  • macro:启用重新导入 #[openapi] 宏(默认启用);
  • axum-integration:启用与 axumhttps://github.com/tokio-rs/axum)包的集成(实现特定 axum 类型的特质)
    • axum 的兼容性:由于集成严重依赖于 axum 类型,这个包将仅与少数(可能甚至只有一个)最新的 axum 版本兼容;
    • 当前支持的 axum 版本:0.7.x
  • yaml:在存在具有 yaml 值的 Accept 标头的条件下,启用在 yaml 格式下提供规范的能力。否则,在存在值 json|*/* 或为空的情况下,提供 json(目前仅影响 axum-integration)。

待办事项

  • 在 MediaType 或 Parameter 上支持示例(通过 JsonSchema 宏支持类型上的示例)
  • 从函数定义中推断参数的架构
  • 在宏中支持重命名或更改路径到 okapi/schemars/okapi-operations
  • 更多示例
  • ...

依赖

~2MB
~49K SLoC