actix_json_responder/
lib.rs

1extern crate proc_macro;
2extern crate quote;
3
4use proc_macro::TokenStream;
5use quote::quote;
6use syn::{parse_macro_input, DeriveInput};
7
8/// Reduces boilerplate for actix view models
9/// Note: type Error has to be in context ( define enum Error or import Error)
10#[proc_macro_derive(JsonResponder)]
11pub fn responder_derive(input: TokenStream) -> TokenStream {
12    let input = parse_macro_input!(input as DeriveInput);
13    let ident = input.ident;
14
15    (quote! {
16        impl actix_web::Responder for #ident {
17            type Body = actix_web::body::BoxBody;
18
19            fn respond_to(self, _: &actix_web::HttpRequest) -> actix_web::HttpResponse<Self::Body> {
20                match serde_json::to_string(&self) {
21                    Err(err) => actix_web::HttpResponse::from_error(err),
22                    Ok(value) => actix_web::HttpResponse::Ok().content_type("application/json").body(value)
23                }
24            }
25        }
26    }).into()
27}