#[derive(TypeStateBuilder)]
{
// Attributes available to this derive:
#[builder]
}
Expand description
Derives a type-safe builder for a struct with compile-time validation of required fields.
This macro automatically generates an appropriate builder pattern based on the struct configuration:
- Type-State Builder for structs with required fields
- Regular Builder for structs with only optional fields
§Basic Usage
use type_state_builder::TypeStateBuilder;
#[derive(TypeStateBuilder)]
struct Person {
#[builder(required)]
name: String,
age: Option<u32>,
}
let person = Person::builder()
.name("Alice".to_string())
.build();§Attribute Reference
§Struct Attributes
#[builder(build_method = "name")]- Custom build method name (default: “build”)#[builder(setter_prefix = "prefix_")]- Prefix for all setter method names
§Field Attributes
#[builder(required)]- Field must be set before build() (creates type-state builder)#[builder(setter_name = "name")]- Custom setter method name#[builder(setter_prefix = "prefix_")]- Custom prefix for this field’s setter (overrides struct-level)#[builder(default = "expr")]- Custom default value (must be valid Rust expression)#[builder(skip_setter)]- Don’t generate setter method (requires default value)
§Generated Methods
The macro generates:
YourStruct::builder()- Creates a new builder instance.field_name(value)- Setter methods for each field (unless skipped).build()- Constructs the final instance (or custom name frombuild_method)
§Compile-Time Safety
The type-state builder (used when there are required fields) prevents:
- Calling
build()before setting required fields - Setting the same required field multiple times
- Invalid attribute combinations
§Error Messages
The macro provides clear error messages for common mistakes:
- Missing required fields at build time
- Invalid attribute combinations
- Generic parameter mismatches
- Syntax errors in default values
§Examples
use type_state_builder::TypeStateBuilder;
#[derive(TypeStateBuilder)]
struct User {
#[builder(required)]
name: String,
age: Option<u32>,
}
let user = User::builder()
.name("Alice".to_string())
.build();