serwus_derive/
lib.rs

1#![deny(rust_2018_idioms)]
2#![warn(clippy::all)]
3
4use proc_macro::TokenStream;
5use quote::quote;
6
7// Empty implementation for statsPresenter
8#[proc_macro_derive(EmptyStats)]
9pub fn empty_stats_macro_derive(input: TokenStream) -> TokenStream {
10    let ast = syn::parse(input).unwrap();
11    impl_empty_stats_macro(&ast)
12}
13
14fn impl_empty_stats_macro(ast: &syn::DeriveInput) -> TokenStream {
15    let name = &ast.ident;
16    let generated = quote! {
17        impl ::serwus::server::stats::StatsPresenter<()> for #name {
18            fn is_ready(&self) -> ::std::pin::Pin<Box<dyn ::std::future::Future<Output=Result<bool, ::actix_web::Error>>>> {
19                Box::pin(::std::future::ready(Ok(true)))
20            }
21            fn get_stats(&self) -> ::std::pin::Pin<Box<dyn ::std::future::Future<Output=Result<(), ::actix_web::Error>>>> {
22                Box::pin(::std::future::ready(Ok(())))
23            }
24        }
25    };
26    generated.into()
27}
28
29#[proc_macro_derive(Canceled)]
30pub fn canceled_macro_derive(input: TokenStream) -> TokenStream {
31    let ast = syn::parse(input).unwrap();
32    impl_canceled_macro(&ast)
33}
34
35fn impl_canceled_macro(ast: &syn::DeriveInput) -> TokenStream {
36    let name = &ast.ident;
37    let generated = quote! {
38        impl ::std::convert::From<::actix_web::error::BlockingError> for #name {
39            fn from(b_err: ::actix_web::error::BlockingError) -> Self {
40                Self::Canceled
41            }
42        }
43    };
44    generated.into()
45}
46
47/// Implements `ResponseError` for struct if it implements Into<ErrorBuilder>
48#[proc_macro_derive(ResponseFromBuilder)]
49pub fn response_from_builder_derive(input: TokenStream) -> TokenStream {
50    let ast = syn::parse(input).unwrap();
51    impl_response_from_builder(&ast)
52}
53
54fn impl_response_from_builder(ast: &syn::DeriveInput) -> TokenStream {
55    let name = &ast.ident;
56    let generated = quote! {
57        impl ::actix_web::ResponseError for #name {
58            fn error_response(&self) -> ::actix_web::HttpResponse {
59                ::serwus::server::json_error::ErrorBuilder::from(self)
60                    .finish()
61                    .error_response()
62            }
63        }
64    };
65    generated.into()
66}