ref.rs

Overview

This file defines multiple Rust structs demonstrating the use of the derive_setters crate to automatically generate setter methods with various configurations. The primary focus is on illustrating how setters can be customized with reference borrowing semantics, renaming, and delegation patterns for fields and methods. The code includes unit tests validating the behavior of these setters.

The file showcases:

These patterns help simplify mutable builder-style APIs for complex data structures, enabling ergonomic and flexible mutation.

Structs and Their Functionality

BasicRefStruct

Fields

Field

Type

Setter Behavior

Setter Name

a

u32

&mut self, renamed to test

test()

b

u32

&mut self (default)

b()

c

u32

Owned self (no borrow)

c()

d

u32

Owned self (no borrow)

d()

Example Usage

let mut s = BasicRefStruct::default().c(34).d(4);
s.test(1);
s.b(3);
assert_eq!(s.a, 1);
assert_eq!(s.b, 3);
assert_eq!(s.c, 34);
assert_eq!(s.d, 4);

FieldRefStruct

Fields

Field

Type

Setter Behavior

a

u32

Default owned setter (takes self)

b

u32

Borrowed setter (takes &mut self)

Example Usage

let mut s = FieldRefStruct::default().a(10);
s.b(20);
assert_eq!(s.a, 10);
assert_eq!(s.b, 20);

InnerRefDelegateStruct

Fields

Field

Type

Setter Behavior

Setter Name

a

u32

&mut self with rename to test

test()

b

u32

&mut self

b()

c

u32

&mut self

c()


BasicRefDelegateField

Fields

Field

Type

x

InnerRefDelegateStruct

Example Usage

let mut s = BasicRefDelegateField::default();
s.test(1);
s.b(3);
s.c(34);
assert_eq!(s.x, InnerRefDelegateStruct { a: 1, b: 3, c: 34 });

BasicRefDelegateMethod

Methods

Fields

Field

Type

x

Option<InnerRefDelegateStruct>

Example Usage

let mut s = BasicRefDelegateMethod::default();
s.test(1);
s.b(3);
s.c(34);
assert_eq!(s.x, Some(InnerRefDelegateStruct { a: 1, b: 3, c: 34 }));

Important Implementation Details

Interactions with Other Parts of the System

Visual Diagram

classDiagram
class BasicRefStruct {
+a: u32
+b: u32
+c: u32
+d: u32
+test()
+b()
+c()
+d()
}
class FieldRefStruct {
+a: u32
+b: u32
+a()
+b()
}
class InnerRefDelegateStruct {
+a: u32
+b: u32
+c: u32
+test()
+b()
+c()
}
class BasicRefDelegateField {
+x: InnerRefDelegateStruct
+test()
+b()
+c()
}
class BasicRefDelegateMethod {
+x: Option~InnerRefDelegateStruct~
+get_x()
+test()
+b()
+c()
}
BasicRefDelegateField --> InnerRefDelegateStruct : delegates setters
BasicRefDelegateMethod --> InnerRefDelegateStruct : delegates setters via get_x()

This diagram illustrates struct relationships and setter delegation patterns implemented in this file.