Ecosyste.ms: Awesome

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

Awesome Lists | Featured Topics | Projects

https://github.com/modprog/non-exhaustive


https://github.com/modprog/non-exhaustive

Last synced: about 1 month ago
JSON representation

Awesome Lists containing this project

README

        

# non-exhaustive

[![CI Status](https://github.com/ModProg/non-exhaustive/actions/workflows/test.yaml/badge.svg)](https://github.com/ModProg/non-exhaustive/actions/workflows/test.yaml)
[![Crates.io](https://img.shields.io/crates/v/non-exhaustive)](https://crates.io/crates/non-exhaustive)
[![Docs.rs](https://img.shields.io/crates/v/template?color=informational&label=docs.rs)](https://docs.rs/non-exhaustive)
[![Documentation for `main`](https://img.shields.io/badge/docs-main-informational)](https://modprog.github.io/non-exhaustive/non_exhaustive/)

Macro to create non_exhaustive structs and structs with private fields with the [functional update syntax](https://doc.rust-lang.org/reference/expressions/struct-expr.html#functional-update-syntax), i.e., using `..Default::default()`.

Given the foreign structs:
```rust
#[non_exhaustive]
#[derive(Default)]
pub struct NonExhaustive {
pub field: usize
}

#[derive(Default)]
pub struct PrivateFields {
pub pub_field: usize,
private_field: usize
}
```

The following is not possible:
```rust
NonExhaustive {
field: 1,
..Default::default()
};

PrivateFields {
pub_field: 1,
..Default::default()
};
```

[`non_exhaustive!`] remedies that:
```rust
use non_exhaustive::non_exhaustive;
# mod module {#[derive(Default)] pub struct NonExhaustive {pub field: usize, _hack: usize} #[derive(Default)] pub struct PrivateFields { pub pub_field: usize, private_field: usize}} use module::*;

non_exhaustive! {NonExhaustive {
field: 1,
..Default::default()
}};

non_exhaustive! {PrivateFields {
pub_field: 1,
..Default::default()
}};
```

For the common case of using [`Default::default()`], [`non_exhaustive!`] allows omitting the `..expression`:

```rust
use non_exhaustive::non_exhaustive;
# mod module {#[derive(Default)] pub struct NonExhaustive {pub field: usize, _hack: usize} #[derive(Default)] pub struct PrivateFields { pub pub_field: usize, private_field: usize}} use module::*;

non_exhaustive!(NonExhaustive { field: 1 });
non_exhaustive!(PrivateFields { pub_field: 1 });
```

Under the hood, [`non_exhaustive!`] is extremely simple, it expands to:

```rust
# mod module {#[derive(Default)] pub struct NonExhaustive {pub field: usize, _hack: usize}} use module::*;

{
let mut value: NonExhaustive = Default::default();
value.field = 1;
value
};
```

[`non_exhaustive!`]: https://docs.rs/non-exhaustive/latest/non_exhaustive/macro.non_exhaustive.html
[`Default::default()`]: https://doc.rust-lang.org/std/default/trait.Default.html