actix-responder-macro

An attribute macro to transform a handler response struct to an actix responder. Keeps flexibility while adding more type safety.

The actix_responder adds 2 additional fields to your struct content_type and status_code. The meta_attr allows for arbitrary attributes to both fields.

status_attr applies only to status_code and content_attr applies only to content_type

The reason for this is like in the example below, if you use a crate like TypedBuilder, you might want to apply options like #[builder(default)] to the generated field.

The macro always applies #[serde(skip)] to both generated fields so they won't show up in the request response.

```rust

[actixresponder(metaattr = "builder(default)")]

[derive(TypedBuilder, Serialize, Deserialize)]

pub struct SuccessResp { success: bool, } ```

From this

```rust

[get("/health_check")]

pub async fn healthcheck() -> impl Responder { HttpResponse::Ok() .setheader(header::CONTENTTYPE, mime::APPLICATIONJSON) .json(SuccessResp { success: true }) } ```

to this

```rust

[get("/health_check")]

pub async fn healthcheck() -> SuccessResp { SuccessResp::builder() .success(true) .contenttype(mime::APPLICATIONJSON::tostring()) .build() } ```

A more complicated example with setting default values

```rust extern crate actixrespondermacro; extern crate mime; extern crate typed_builder;

use actixrespondermacro::actixresponder; use actixweb::http::StatusCode; use serde::{Deserialize, Serialize}; use typed_builder::TypedBuilder;

[actix_responder(

status_attr = "builder(default = StatusCode::INTERNAL_SERVER_ERROR)",
content_attr = "builder(default = mime::IMAGE_BMP.to_string())"

)]

[derive(Serialize, Deserialize, Debug, TypedBuilder, Default)]

pub struct ImageResp {...} ```