readonly 0.2.7

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

[<img alt="github" src="" height="20">](
[<img alt="" src="" height="20">](
[<img alt="" src="" height="20">](
[<img alt="build status" src="" height="20">](

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.

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 {
    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,


#### License

Licensed under either of <a href="LICENSE-APACHE">Apache License, Version
2.0</a> or <a href="LICENSE-MIT">MIT license</a> 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.