1use proc_macro::TokenStream;
2use quote::ToTokens;
3use syn::{parse::Nothing, parse_macro_input, parse_quote, ItemStruct};
4
5#[proc_macro_attribute]
27pub fn pub_fields(attr: TokenStream, tokens: TokenStream) -> TokenStream {
28 parse_macro_input!(attr as Nothing);
29 let mut item_struct = parse_macro_input!(tokens as ItemStruct);
30 for field in &mut item_struct.fields {
31 field.vis = match &field.vis {
32 syn::Visibility::Public(p) => syn::Visibility::Public(*p),
33 syn::Visibility::Restricted(res) => syn::Visibility::Restricted(res.clone()),
34 syn::Visibility::Inherited => parse_quote!(pub),
35 };
36 }
37 item_struct.to_token_stream().into()
38}