reach_core/memory/
macros.rs

1// SPDX-FileCopyrightText: 2025 eaon <eaon@posteo.net>
2// SPDX-License-Identifier: EUPL-1.2
3
4#[macro_export]
5#[doc(hidden)]
6macro_rules! _immutable_cell {
7    (or: $field:tt, $inner:ty, $error:ident::$($error_variant:tt)::*) => {
8        immutable_cell!(only or: $field, $inner, $error);
9        immutable_cell!(set: $field, $inner, $error::$($error_variant)::*);
10    };
11
12    (only or: $field:tt, $inner:ty, $error:ty) => {
13        paste::paste! {
14            pub fn [<$field _or>](&self, error: $error) -> Result<&$inner, $error> {
15                self.$field.get_or(error)
16            }
17        }
18    };
19
20    (or_init: $field:tt, $inner:ty, $error:ident) => {
21        immutable_cell!(only or: $field, $inner, $error);
22
23        paste::paste! {
24            pub fn [<$field _or_init>]<F>(&self, f: F) -> &$inner
25            where
26                F: FnOnce() -> $inner,
27            {
28                self.$field.get_or_init(f)
29            }
30        }
31    };
32
33    (set: $field:tt, $inner:ty, $error:ident::$($error_variant:tt)::*) => {
34        paste::paste! {
35            pub fn [<set_ $field>](&self, value: $inner) -> Result<(), $error> {
36                self.$field.set(value).map_err(|_| $error::$($error_variant)::*)
37            }
38        }
39    };
40}
41
42#[doc(inline)]
43pub use _immutable_cell as immutable_cell;