Derive Macro TypeStateBuilder

Source
#[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 from build_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();