Crates.io | incrstruct_derive |
lib.rs | incrstruct_derive |
version | 0.1.3 |
source | src |
created_at | 2024-08-12 07:38:10.81263 |
updated_at | 2024-08-13 16:25:40.698365 |
description | The IncrStruct derive macro, see crate incrstruct |
homepage | |
repository | https://github.com/tommie/incrstruct |
max_upload_size | |
id | 1334087 |
size | 20,521 |
A Rust crate for building self-referencing structs using two-phase initialization.
use std::cell::{Ref, RefCell};
use incrstruct::IncrStruct;
#[derive(IncrStruct)]
struct AStruct<'a> {
#[borrows(b)] // Borrowing from a tail field
c: &'a Ref<'a, i32>, // is possible.
#[borrows(a)] // You can only borrow from fields that
b: Ref<'a, i32>, // come after the current field.
a: RefCell<i32>, // A head field. Since you can only borrow
// immutable references, RefCell is useful.
#[header] // The required header field.
hdr: incrstruct::Header, // The name is arbitrary.
}
// The AStructInit trait is generated by the derive macro and
// ensures the contract between the incrstruct library code and
// the user provided code matches. The functions are invoked in
// reverse field declaration order.
impl<'a> AStructInit<'a> for AStruct<'a> {
fn init_field_c(b: &'a Ref<'a, i32>) -> &'a Ref<'a, i32> {
b
}
fn init_field_b(a: &'a RefCell<i32>) -> Ref<'a, i32> {
a.borrow()
}
}
// Only head fields are provided to the generated `new_X` functions.
let my_a = AStruct::new_box(RefCell::new(42));
assert_eq!(*my_a.a.borrow(), *my_a.b);
See the documentation for more information.