pub_fields/
lib.rs

1use proc_macro::TokenStream;
2use quote::ToTokens;
3use syn::{parse::Nothing, parse_macro_input, parse_quote, ItemStruct};
4
5/// A simple attribute that makes all fields public on a struct.
6///
7/// Usage:
8/// ```rust
9/// use pub_fields::pub_fields;
10///
11/// #[pub_fields]
12/// pub struct MyStruct {
13///     a: usize,
14///     b: usize,
15///     c: usize,
16/// }
17/// ```
18/// =>
19/// ```rust
20/// pub struct MyStruct {
21///     pub a: usize,
22///     pub b: usize,
23///     pub c: usize,
24/// }
25/// ```
26#[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}