captcha_oxide_derive 4.0.0

Useful proc macros for captcha_oxide
Documentation
use quote::quote;
use syn::{parse::Parser, Field, Fields, ItemStruct};

pub fn captcha_solution_expansion(
    item: proc_macro2::TokenStream,
) -> syn::Result<proc_macro2::TokenStream> {
    let mut ast = syn::parse2::<ItemStruct>(item)?;

    let Fields::Named(ref mut fields) = ast.fields else {
        return Err(syn::Error::new(
            proc_macro2::Span::call_site(),
            "This attribute can only be used with structs that contain named fields",
        ));
    };

    let task_id_field = quote! {
        #[serde(default = "Default::default")]
        task_id: u64
    };

    fields.named.push(Field::parse_named.parse2(task_id_field)?);

    let ident = &ast.ident;
    let (impl_generics, type_generics, where_clause) = ast.generics.split_for_impl();

    Ok(quote! {
        #[derive(Debug, serde::Deserialize)]
        #ast

        impl #impl_generics crate::captcha_types::CaptchaSolution for #ident #type_generics #where_clause {
            fn get_task_id(&self) -> u64 {
                self.task_id
            }

            fn set_task_id(&mut self, task_id: u64) {
                self.task_id = task_id
            }
        }
    })
}