From e18eb7bb02441967b54b77e8bfd6346b9daf7dad Mon Sep 17 00:00:00 2001 From: buckn Date: Mon, 14 Jul 2025 21:14:28 -0400 Subject: [PATCH] ud --- src/lib.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 0267aa1..221d627 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,11 +5,9 @@ use syn::{parse_macro_input, ItemEnum, DeriveInput, Data}; #[proc_macro_attribute] pub fn http_response(_attr: TokenStream, item: TokenStream) -> TokenStream { - // Clone the input token stream for separate parsing uses let item_for_ast = item.clone(); let item_for_quote = item.clone(); - // Parse the input into a syntax tree let ast: DeriveInput = parse_macro_input!(item_for_ast as DeriveInput); let name = &ast.ident; @@ -21,7 +19,7 @@ pub fn http_response(_attr: TokenStream, item: TokenStream) -> TokenStream { Self: serde::de::DeserializeOwned + Sized, { fn receive(resp: awc::ClientResponse) -> Result> { - let parsed = awc::rt::System::new() + let parsed = actix_web::rt::System::new() .block_on(async { resp.json::().await }) @@ -39,7 +37,7 @@ pub fn http_response(_attr: TokenStream, item: TokenStream) -> TokenStream { syn::Fields::Unnamed(fields) if fields.unnamed.len() == 1 => { let inner_ty = &fields.unnamed.first().unwrap().ty; Some(quote! { - if let Ok(inner) = <#inner_ty as Responsable>::receive(resp.clone()) { + if let Ok(inner) = serde_json::from_slice::<#inner_ty>(&body) { return Ok(#name::#vname(inner)); } }) @@ -51,6 +49,12 @@ pub fn http_response(_attr: TokenStream, item: TokenStream) -> TokenStream { quote! { impl Responsable for #name { fn receive(resp: awc::ClientResponse) -> Result> { + let body = actix_web::rt::System::new() + .block_on(async { + resp.body().await + }) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?; + #(#variant_arms)* Err(Box::new(std::io::Error::new( @@ -65,10 +69,8 @@ pub fn http_response(_attr: TokenStream, item: TokenStream) -> TokenStream { _ => panic!("#[http_response] only supports structs and tuple-style enum variants"), }; - // Parse the original item (struct or enum) for output let original: syn::Item = syn::parse(item_for_quote).expect("Failed to parse item as syn::Item"); - // Combine the original item and the impl block into final tokens let output = quote! { #original #impl_block @@ -76,6 +78,7 @@ pub fn http_response(_attr: TokenStream, item: TokenStream) -> TokenStream { output.into() } + #[proc_macro_derive(ResponseVec)] pub fn derive_response_vec(input: TokenStream) -> TokenStream { let input = parse_macro_input!(input as DeriveInput);