warcrwlock 3.0.1

A crate in Rust that provides an attribute macro for structs and traits. Rewrite code using under the hood asynchronous reference (Arc) and asynchronous writing and read(RWlock) control elements.
Documentation
use quote::ToTokens;
use syn::{ItemStruct, parse_quote, parse_str, Fields, Ident, Type};

use crate::helpers::full_base_struct_name;

pub fn core_normalization(base: ItemStruct) -> ItemStruct {
    let mut base = base;
    base.vis = parse_quote!(pub);
    if let Fields::Named(field_named) = &mut base.fields{
        field_named.named.iter_mut().for_each(|field|{
            field.attrs.clear();
            field.vis = parse_quote!(pub(super));
        });   
    }
    base.attrs.push(parse_quote!(#[doc(hidden)]));
    let name_macro = crate::helpers::ATTRIBUTE_NAME;
    if base.generics.lifetimes().count() > 0 {
        panic!("The {name_macro} macro does not support \"lifetimes\"!");
    }
    base.clone()
}

pub fn wrapper_normalization(wrapper: ItemStruct) -> ItemStruct {
    let mut wrapper = wrapper;
    wrapper.attrs.clear();
    let bfn = crate::helpers::BASE_FIELD_NAME;
    let mut bsn = full_base_struct_name(wrapper.ident.clone());
    if wrapper.generics.params.len() > 0 {
        let generics = crate::helpers::filter_generics(&wrapper
            .generics)
            .params
            .clone()
            .into_token_stream()
            .to_string();
        bsn = format!("{bsn}<{generics}>");
    }
    let field_name: Ident = parse_str(&format!("{bfn}")).unwrap();
    let field_type: Type = parse_str(&format!("Arc<RwLock<{bsn}>>")).unwrap();
    let aux: ItemStruct = parse_quote!(
        pub struct Wrapper{
            #field_name : #field_type
        }
    );
    wrapper.attrs.push(parse_quote!(#[repr(C)]));
    wrapper.fields = aux.fields;
    wrapper.vis = aux.vis;
    wrapper.clone()
}