diff --git a/src/lib.rs b/src/lib.rs index d77bfb6..e6e67c3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -136,3 +136,58 @@ pub fn derive_http_response(input: TokenStream) -> TokenStream { TokenStream::from(expanded) } + +#[proc_macro_derive(SendVec)] +pub fn derive_send_vec(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + let name = &input.ident; + + let expanded = quote! { + impl #name { + /// Sends all items in the vec sequentially, awaiting each. + pub async fn send_vec( + items: Vec, + client: std::sync::Arc, + headers: Option>, + api_key: Option<&str>, + ) -> Result, awc::error::SendRequestError> { + let mut responses = Vec::with_capacity(items.len()); + for item in items { + let resp = item.send(client.clone(), headers.clone(), api_key).await?; + responses.push(resp); + } + Ok(responses) + } + } + }; + + TokenStream::from(expanded) +} + +#[proc_macro_derive(ResponseVec)] +pub fn derive_response_vec(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + let name = &input.ident; + + let expanded = quote! { + impl #name { + /// Deserializes all responses sequentially into a Vec. + /// Assumes `Self` implements `DeserializeOwned`. + pub async fn response_vec( + responses: Vec, + ) -> Result, awc::error::JsonPayloadError> + where + Self: Sized + serde::de::DeserializeOwned, + { + let mut results = Vec::with_capacity(responses.len()); + for resp in responses { + let item = resp.json::().await?; + results.push(item); + } + Ok(results) + } + } + }; + + TokenStream::from(expanded) +}