#macro #attribute-macro #readable #field #struct #attributes #module #read-only #fields #expose

macro no-std readonly

Struct fields that are made read-only accessible to other modules

14 releases

new 0.2.7 Mar 18, 2023
0.2.3 Dec 17, 2022
0.2.2 Aug 3, 2022
0.2.1 Apr 24, 2022
0.1.2 Mar 27, 2019

#465 in Rust patterns

Download history 7521/week @ 2022-11-26 7155/week @ 2022-12-03 7773/week @ 2022-12-10 7948/week @ 2022-12-17 3327/week @ 2022-12-24 6747/week @ 2022-12-31 8993/week @ 2023-01-07 9306/week @ 2023-01-14 9206/week @ 2023-01-21 12137/week @ 2023-01-28 8349/week @ 2023-02-04 10651/week @ 2023-02-11 9854/week @ 2023-02-18 10734/week @ 2023-02-25 12330/week @ 2023-03-04 14501/week @ 2023-03-11

49,224 downloads per month
Used in 33 crates (24 directly)

MIT/Apache

12KB
164 lines

Readonly

github crates.io docs.rs build status

This crate provides an attribute macro to expose struct fields that are readable and writable from within the same module but readable only outside the module.

[dependencies]
readonly = "0.2"

Syntax

Place #[readonly::make] on a braced struct or tuple struct. This will make all fields of the struct publicly readable according to their individual visibility specifiers, but not writable from other modules.

mod m {
    #[readonly::make]
    pub struct S {
        pub n: i32,
    }

    impl S {
        pub fn demo(&mut self) {
            // Can read and write from inside the same module.
            println!("{}", self.n);
            self.n += 1;
        }
    }
}

fn demo(s: &mut m::S) {
    // From outside the module, can only read.
    println!("{}", s.n);

    // Does not compile:
    //s.n += 1;
}

The error appears as follows.

error[E0594]: cannot assign to data in a dereference of `m::S`
  --> readme.rs:21:5
   |
21 |     s.n += 1;
   |     ^^^^^^^^ cannot assign

Optionally, place #[readonly] on individual struct fields to make just those fields publicly readable, without affecting other fields of the struct.

#[readonly::make]
pub struct S {
    // This field can be read (but not written) by super.
    #[readonly]
    pub(super) readable: i32,

    // This field can be neither read nor written by other modules.
    private: i32,
}

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~0.7–1MB
~26K SLoC