Crates.io | readonly |
lib.rs | readonly |
version | 0.2.12 |
source | src |
created_at | 2019-03-27 02:28:15.273911 |
updated_at | 2024-01-02 06:56:49.499617 |
description | Struct fields that are made read-only accessible to other modules |
homepage | |
repository | https://github.com/dtolnay/readonly |
max_upload_size | |
id | 124089 |
size | 28,394 |
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,
}