1#![deny(rust_2018_idioms)]
2#![warn(clippy::all)]
3
4use proc_macro::TokenStream;
5use quote::quote;
6
7#[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#[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}