#actix-web #proc-macro #actix #actix-responder

actix_responder_macro

将响应结构体转换为actix响应器的属性宏

4个版本

0.0.4 2020年12月1日
0.0.3 2020年11月29日
0.0.2 2020年11月29日
0.0.1 2020年11月27日

#1045 in 过程宏

MIT/Apache

12KB
200

actix-responder-macro

一个属性宏,可以将处理器响应结构体转换为 actix responder。在添加更多类型安全的同时保持灵活性。

actix_responder 为您的结构体添加了两个额外字段 content_typestatus_codemeta_attr 允许对这两个字段使用任意属性。

status_attr 仅应用于 status_code,而 content_attr 仅应用于 content_type

原因如下,例如,如果您使用 TypedBuilder 这样的crate,您可能想将选项如 #[builder(default)] 应用到生成的字段。

宏始终将 #[serde(skip)] 应用到生成的字段,这样它们就不会出现在请求响应中。

#[actix_responder(meta_attr = "builder(default)")]
#[derive(TypedBuilder, Serialize, Deserialize)]
pub struct SuccessResp {
    success: bool,
}

从这

#[get("/health_check")]
pub async fn health_check() -> impl Responder {
    HttpResponse::Ok()
    .set_header(header::CONTENT_TYPE, mime::APPLICATION_JSON)
    .json(SuccessResp { success: true })
}

到这

#[get("/health_check")]
pub async fn health_check() -> SuccessResp {
    SuccessResp::builder()
    .success(true)
    .content_type(mime::APPLICATION_JSON::to_string())
    .build()
}

一个更复杂的示例,设置默认值

extern crate actix_responder_macro;
extern crate mime;
extern crate typed_builder;

use actix_responder_macro::actix_responder;
use actix_web::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 {...}

依赖项

~1.5MB
~36K SLoC