Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/dtolnay/readonly

Struct fields that are made read-only accessible to other modules
https://github.com/dtolnay/readonly

Last synced: 10 days ago
JSON representation

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

Awesome Lists containing this project

README

        

Readonly
========

[github](https://github.com/dtolnay/readonly)
[crates.io](https://crates.io/crates/readonly)
[docs.rs](https://docs.rs/readonly)
[build status](https://github.com/dtolnay/readonly/actions?query=branch%3Amaster)

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.

```toml
[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.

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

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

```rust
#[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.