#openapi #swagger #axum #rust

okapi-operation

Procedural macro for generating OpenAPI operation specification (using okapi)

3 releases

Uses new Rust 2021

0.1.2 Aug 6, 2022
0.1.1 Jul 11, 2022
0.1.0 Jul 10, 2022

#600 in Web programming

Download history 68/week @ 2022-08-13 33/week @ 2022-08-20 19/week @ 2022-08-27 6/week @ 2022-09-03 19/week @ 2022-09-10 19/week @ 2022-09-17 28/week @ 2022-09-24 14/week @ 2022-10-01 21/week @ 2022-10-08 46/week @ 2022-10-15 22/week @ 2022-10-22 26/week @ 2022-10-29 72/week @ 2022-11-05 34/week @ 2022-11-12 87/week @ 2022-11-19 61/week @ 2022-11-26

255 downloads per month

MIT license

56KB
1.5K SLoC

okapi-operation

Crates.io docs.rs CI

Library which allow to generate OpenAPI's operation definitions (using types from okapi crate) with procedural macro #[openapi].

Example (with axum-integration feature).

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(
    #[request_body(description = "Echo data", required = true)] body: Json<Request>,
) -> Json<String> {
    Json(body.0.data)
}

fn main() {
    // Here you can also add security schemes, other operations, modify internal OpenApi object.
    let oas_builder = OpenApiBuilder::new("Demo", "1.0.0");
    
    let app = Router::new()
        .route("/echo/get", get(openapi_handler!(echo_get)))
        .route("/echo/post", post(openapi_handler!(echo_post)))
        .route_openapi_specification("/openapi", oas_builder)
        .expect("no problem");

    let fut = async {
        axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())
            .serve(app.into_make_service())
            .await
            .unwrap();
    };
    //tokio::runtime::Runtime::new().block_on(fut);
}

Features

  • macro: enables re-import of #[openapi] macro (enabled by default);
  • axum-integration: enables integration with axum(https://github.com/tokio-rs/axum) crate (implement traits for certain axum types).

TODO

  • support examples on MediaType or Parameter (examples supported on types via JsonSchema macro)
  • support inferring schemas of parameters from function definitions
  • support for renaming or changing paths to okapi/schemars/okapi-operations in macro
  • more examples
  • ...

Dependencies

~2.3–8.5MB
~156K SLoC