Struct fields that are made read-only accessible to other modules
Rust
269
148 commits
updated Aug 3, 2026
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"
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,
}
Overall
Maintained
Code review
crates.io
Latest release
Releases this year
214 followers · starred Feb 2025
834 followers · starred Sep 2024
56 followers · starred Aug 2020
253 followers · starred Sep 2025
Struct fields that are made read-only accessible to other modules
Rust
269
148 commits
updated Aug 3, 2026
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"
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,
}
Overall
Maintained
Code review
crates.io
Latest release
Releases this year
214 followers · starred Feb 2025
834 followers · starred Sep 2024
56 followers · starred Aug 2020
253 followers · starred Sep 2025