darpi_code_gen/
request.rs1use 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}