okapi icon indicating copy to clipboard operation
okapi copied to clipboard

Derive for OpenApiResponderInner

Open vklachkov opened this issue 1 year ago • 0 comments

Description

This PR adds derive macro for the OpenApiResponderInner trait. It's fully compatible with Rocket's Response derive macro.

Also, to reduce code generation, add set_description function to utils.

This pull request does not add any usage examples.

Codegen Examples

  1. Simple enum:

    #[derive(Responder, OpenApiResponder)]
    enum ServerResult {
        A(String),
        B(Json<u32>),
    }
    
    Macro expansion
    impl ::rocket_okapi::response::OpenApiResponderInner for ServerResult {
        fn responses(
            gen: &mut ::rocket_okapi::gen::OpenApiGenerator,
        ) -> ::rocket_okapi::Result<::rocket_okapi::okapi::openapi3::Responses> {
            let mut responses = ::rocket_okapi::okapi::openapi3::Responses::default();
            responses.responses.extend(
                {
                    let mut r =
                        <String as ::rocket_okapi::response::OpenApiResponderInner>::responses(gen)?;
                    r
                }
                .responses,
            );
            responses.responses.extend(
                {
                    let mut r =
                        <Json<u32> as ::rocket_okapi::response::OpenApiResponderInner>::responses(gen)?;
                    r
                }
                .responses,
            );
            Ok(responses)
        }
    }
    
  2. Generic struct:

    #[derive(Responder, OpenApiResponder)]
    #[response(status = 404, content_type = "html")]
    struct NotFoundHtml<T>(T);
    
    Macro expansion
    impl<T: ::rocket_okapi::response::OpenApiResponderInner> ::rocket_okapi::response::OpenApiResponderInner for NotFoundHtml<T> {
        fn responses(
            gen: &mut ::rocket_okapi::gen::OpenApiGenerator,
        ) -> ::rocket_okapi::Result<::rocket_okapi::okapi::openapi3::Responses> {
            let mut responses = ::rocket_okapi::okapi::openapi3::Responses::default();
            responses.responses.extend(
                {
                    let mut r = <T as ::rocket_okapi::response::OpenApiResponderInner>::responses(gen)?;
                    ::rocket_okapi::util::set_status_code(&mut r, 404u16)?;
                    ::rocket_okapi::util::set_content_type(&mut r, "text/html; charset=utf-8")?;
                    r
                }
                .responses,
            );
            Ok(responses)
        }
    }
    

Issues

Fixes https://github.com/GREsau/okapi/issues/146.

vklachkov avatar Dec 19 '24 17:12 vklachkov