megacommerce_shared_sanitize_derive/
lib.rs

1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{parse_macro_input, punctuated::Punctuated, Path, Token};
4
5#[proc_macro]
6pub fn sanitize_app_error(input: TokenStream) -> TokenStream {
7  // Parse: a list of paths separated by commas
8  let args = parse_macro_input!(input with Punctuated::<Path, Token![,]>::parse_terminated);
9
10  if args.len() != 2 {
11    return syn::Error::new_spanned(args, "expected 2 arguments: (ResponseType, ResponseEnumPath)")
12      .to_compile_error()
13      .into();
14  }
15
16  let ty = &args[0]; // e.g. EmailConfirmationResponse
17  let enum_ty = &args[1]; // e.g. email_confirmation_response::Response
18
19  let expanded = quote! {
20      impl SanitizeAppError for #ty {
21          fn sanitize_app_error_fields(&mut self) {
22              if let Some(#enum_ty::Error(err)) = self.response.take() {
23                  self.response = Some(#enum_ty::Error(sanitize_app_error(&err)));
24              }
25          }
26      }
27  };
28
29  expanded.into()
30}