incrstruct 0.1.2

Build self-referencing structs using two-phase initialization
Documentation
  • Coverage
  • 70.59%
    12 out of 17 items documented1 out of 13 items with examples
  • Size
  • Source code size: 31.03 kB This is the summed size of all the files inside the crates.io package for this release.
  • Documentation size: 1.96 MB This is the summed size of all files generated by rustdoc for all configured targets
  • Ø build duration
  • this release: 14s Average build duration of successful builds.
  • all releases: 14s Average build duration of successful builds in releases after 2024-10-23.
  • Links
  • tommie/incrstruct
    0 0 0
  • crates.io
  • Dependencies
  • Versions
  • Owners
  • tommie

Incremental Structure

crates.io docs.rs GitHub last commit

A Rust crate for building self-referencing structs using two-phase initialization.

Example

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.