Skip to main content

darpi_code_gen/
request.rs

1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{parse_macro_input, token::Pound, AttrStyle, Attribute, Error, Fields, ItemStruct, Path};
4
5pub(crate) fn make_path_type(_: TokenStream, input: TokenStream) -> TokenStream {
6    let mut struct_arg = parse_macro_input!(input as ItemStruct);
7    let name = struct_arg.ident.clone();
8
9    if let Fields::Named(ref mut named) = &mut struct_arg.fields {
10        if named.named.is_empty() {
11            return Error::new_spanned(named, "Empty path makes no sense")
12                .to_compile_error()
13                .into();
14        }
15
16        named.named.iter_mut().for_each(|f| {
17            f.attrs.push(Attribute {
18                pound_token: Pound::default(),
19                style: AttrStyle::Outer,
20                bracket_token: Default::default(),
21                path: Path {
22                    leading_colon: None,
23                    segments: Default::default(),
24                },
25                tokens: quote! {
26                    serde(deserialize_with = "darpi::from_str")
27                },
28            })
29        });
30
31        let tokens = quote! {
32            #struct_arg
33            impl darpi::response::ErrResponder<darpi::request::PathError, darpi::Body> for #name {
34                fn respond_err(e: darpi::request::PathError) -> darpi::Response<darpi::Body> {
35                    let msg = match e {
36                        darpi::request::PathError::Deserialize(msg) => msg,
37                    };
38
39                    darpi::Response::builder()
40                        .status(darpi::StatusCode::BAD_REQUEST)
41                        .body(darpi::Body::from(msg))
42                        .expect("this not to happen!")
43                }
44            }
45        };
46
47        return tokens.into();
48    }
49    Error::new_spanned(struct_arg, "Tuple structs not supported")
50        .to_compile_error()
51        .into()
52}
53
54pub(crate) fn make_query_type(_: TokenStream, input: TokenStream) -> TokenStream {
55    let struct_arg = parse_macro_input!(input as ItemStruct);
56    let name = &struct_arg.ident;
57
58    let tokens = quote! {
59        #struct_arg
60        impl darpi::response::ErrResponder<darpi::request::QueryPayloadError, darpi::Body> for #name {
61            fn respond_err(e: darpi::request::QueryPayloadError) -> darpi::Response<darpi::Body> {
62                let msg = match e {
63                    darpi::request::QueryPayloadError::Deserialize(de) => de.to_string(),
64                    darpi::request::QueryPayloadError::NotExist => "missing query params".to_string(),
65                };
66
67                darpi::Response::builder()
68                    .status(darpi::StatusCode::BAD_REQUEST)
69                    .body(darpi::Body::from(msg))
70                    .expect("this not to happen!")
71            }
72        }
73    };
74    tokens.into()
75}