Crate readonly

source ·
Expand description


Struct fields that can be read and written from within the same module, but from outside the module can only be read.


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 {
    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`
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.

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

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

Attribute Macros