rust-libretro-proc 0.3.2

Procedural macros for rust-libretro
Documentation
pub fn is_public(item: &syn::Item) -> bool {
    match &item {
        syn::Item::Const(item) => matches!(item.vis, syn::Visibility::Public(_)),
        syn::Item::Enum(item) => matches!(item.vis, syn::Visibility::Public(_)),
        syn::Item::Fn(item) => matches!(item.vis, syn::Visibility::Public(_)),
        syn::Item::Macro2(item) => matches!(item.vis, syn::Visibility::Public(_)),
        syn::Item::Mod(item) => matches!(item.vis, syn::Visibility::Public(_)),
        syn::Item::Static(item) => matches!(item.vis, syn::Visibility::Public(_)),
        syn::Item::Struct(item) => matches!(item.vis, syn::Visibility::Public(_)),
        syn::Item::Trait(item) => matches!(item.vis, syn::Visibility::Public(_)),
        syn::Item::TraitAlias(item) => matches!(item.vis, syn::Visibility::Public(_)),
        syn::Item::Type(item) => matches!(item.vis, syn::Visibility::Public(_)),
        syn::Item::Union(item) => matches!(item.vis, syn::Visibility::Public(_)),
        _ => false,
    }
}

pub fn get_visibility_mut(item: &mut syn::Item) -> Option<&mut syn::Visibility> {
    match item {
        syn::Item::Const(item) => Some(&mut item.vis),
        syn::Item::Enum(item) => Some(&mut item.vis),
        syn::Item::Fn(item) => Some(&mut item.vis),
        syn::Item::Macro2(item) => Some(&mut item.vis),
        syn::Item::Mod(item) => Some(&mut item.vis),
        syn::Item::Static(item) => Some(&mut item.vis),
        syn::Item::Struct(item) => Some(&mut item.vis),
        syn::Item::Trait(item) => Some(&mut item.vis),
        syn::Item::TraitAlias(item) => Some(&mut item.vis),
        syn::Item::Type(item) => Some(&mut item.vis),
        syn::Item::Union(item) => Some(&mut item.vis),
        _ => None,
    }
}

pub fn get_attrs_mut(item: &mut syn::Item) -> Option<&mut Vec<syn::Attribute>> {
    match item {
        syn::Item::Const(item) => Some(&mut item.attrs),
        syn::Item::Enum(item) => Some(&mut item.attrs),
        syn::Item::Fn(item) => Some(&mut item.attrs),
        syn::Item::Macro(item) => Some(&mut item.attrs),
        syn::Item::Macro2(item) => Some(&mut item.attrs),
        syn::Item::Mod(item) => Some(&mut item.attrs),
        syn::Item::Static(item) => Some(&mut item.attrs),
        syn::Item::Struct(item) => Some(&mut item.attrs),
        syn::Item::Trait(item) => Some(&mut item.attrs),
        syn::Item::TraitAlias(item) => Some(&mut item.attrs),
        syn::Item::Type(item) => Some(&mut item.attrs),
        syn::Item::Union(item) => Some(&mut item.attrs),
        _ => None,
    }
}

pub fn prepend_doc(attrs: &mut Vec<syn::Attribute>, doc: &str) {
    let mut had_doc = false;

    for (index, attribute) in attrs.iter_mut().enumerate() {
        if attribute.path.is_ident("doc") {
            let doc = syn::parse_quote! {
                #[doc = #doc]
            };

            *attrs = [&attrs[0..index], &[doc], &attrs[index..]].concat();
            had_doc = true;

            break;
        }
    }

    if !had_doc {
        attrs.push(syn::parse_quote! {
            #[doc = #doc]
        });
    }
}