basics.rs

Overview

This file defines several Rust structs with automatically generated setter methods using the derive_setters procedural macro. These setters facilitate building and modifying struct instances in a fluent style. The file demonstrates various features of the derive_setters macro including delegate setters, prefix customization, option stripping, type conversion via Into, and boolean flag setters.

The purpose is to showcase and test different setter generation capabilities on simple data structures, enabling ergonomic and concise mutation of fields.


Structs and Their Functionalities

BasicStruct

struct BasicStruct {
    a: u32,
    b: u32,
    c: u32,
}
let s = BasicStruct::default().test(30).b(10).c(20);
assert_eq!(s, BasicStruct { a: 30, b: 10, c: 20 });

BasicDelegateField

struct BasicDelegateField {
    x: BasicStruct,
}
let d = BasicDelegateField::default().b(15).test(10);
assert_eq!(d, BasicDelegateField { x: BasicStruct { a: 10, b: 15, c: 0 } });

BasicDelegateMethod

struct BasicDelegateMethod {
    x: Option<BasicStruct>,
}
fn get_x(&mut self) -> &mut BasicStruct {
    if self.x.is_none() {
        self.x = Some(BasicStruct::default());
    }
    self.x.as_mut().unwrap()
}
let d = BasicDelegateMethod::default().b(15).test(10);
assert_eq!(d, BasicDelegateMethod { x: Some(BasicStruct { a: 10, b: 15, c: 0 }) });

PrefixBasicDelegateField

struct PrefixBasicDelegateField {
    x: BasicStruct,
}
let p = PrefixBasicDelegateField::default().with_b(15).with_test(10);
assert_eq!(p, PrefixBasicDelegateField { x: BasicStruct { a: 10, b: 15, c: 0 } });

GenericStruct<'a, T>

struct GenericStruct<'a, T> {
    a: Option<&'a T>,
    b: Option<&'a T>,
    c: T,
}
let g = GenericStruct::default().a(Some(&30)).b(Some(&10)).c(20);
assert_eq!(g, GenericStruct { a: Some(&30), b: Some(&10), c: 20 });

StripOptionStruct

struct StripOptionStruct {
    a: Option<u32>,
    b: Option<u32>,
    c: Option<u32>,
    d: u32,
}
let s = StripOptionStruct::default().a(3).b(42).c(43).d(7);
assert_eq!(s, StripOptionStruct { a: Some(3), b: Some(42), c: Some(43), d: 7 });

IntoStruct<'a>

struct IntoStruct<'a> {
    a: Cow<'a, str>,
    b: Option<Cow<'a, str>>,
}
let testb = "testb".to_string();
let i = IntoStruct::default().a("testa").b(&testb);
assert_eq!(i, IntoStruct { a: "testa".into(), b: Some("testb".into()) });

WithStruct

struct WithStruct {
    a: u32,
    b: u32,
    c: u32,
}
let w = WithStruct::default().test(30).with_b(10).with_c(20);
assert_eq!(w, WithStruct { a: 30, b: 10, c: 20 });

BoolStruct

struct BoolStruct {
    a: bool,
    b: bool,
    c: bool,
}
let b = BoolStruct::default().a().c();
assert_eq!(b, BoolStruct { a: true, b: false, c: true });

Tests

Each struct is accompanied by one or more #[test] functions validating the behavior of generated setters. These demonstrate method chaining, option stripping, delegation, and prefixing features.


Implementation Details and Algorithms


Interaction with Other Parts of the System


Diagram: Structs and Setter Delegation Relationships

classDiagram
class BasicStruct {
+a: u32
+b: u32
+c: u32
+test()
+b()
+c()
}
class BasicDelegateField {
+x: BasicStruct
+test()
+b()
+c()
}
class BasicDelegateMethod {
+x: Option<BasicStruct>
+get_x()
+test()
+b()
+c()
}
class PrefixBasicDelegateField {
+x: BasicStruct
+with_test()
+with_b()
+with_c()
}
BasicDelegateField --> BasicStruct : delegates setters
BasicDelegateMethod --> BasicStruct : delegates setters via get_x()
PrefixBasicDelegateField --> BasicStruct : delegates setters with prefix 'with_'
class GenericStruct {
+a: Option<&T>
+b: Option<&T>
+c: T
+a()
+b()
+c()
}
class StripOptionStruct {
+a: Option<u32>
+b: Option<u32>
+c: Option<u32>
+d: u32
+a()
+b()
+c()
+d()
}
class IntoStruct {
+a: Cow<str>
+b: Option<Cow<str>>
+a()
+b()
}
class WithStruct {
+a: u32
+b: u32
+c: u32
+test()
+with_b()
+with_c()
}
class BoolStruct {
+a: bool
+b: bool
+c: bool
+a()
+b()
+c()
}

Summary of Key Attributes and Macros

For detailed explanations of procedural macros and their usage, see the derive_setters topic.


Usage Example Snippet

let mut s = BasicStruct::default()
    .test(5)   // sets field a
    .b(10)
    .c(15);

let mut d = BasicDelegateField::default()
    .test(5)   // delegated to inner BasicStruct
    .b(10);

This snippet illustrates fluent and chained setter invocations enabled by the macros.


This file is a comprehensive demonstration of automatic setter generation techniques applied to various Rust structs, emphasizing delegation, genericity, option handling, and boolean toggling.