#builder #builder-pattern #struct #required #macro #optional #procedural

simple-builder

A procedural macro for creating a builder-pattern struct for any struct

1 unstable release

0.0.2 Oct 12, 2023

#2981 in Rust patterns

36 downloads per month
Used in kraken-async-rs

MIT license

11KB
179 lines

simple-builder

A simple implementation of the builder pattern for arbitrary Rust structs.

badge License: MIT

This package could easily be called "yet-another-builder" (YAB for short), but it fills a niche for those looking less for features in a builder implementation, and more for ease of use. In particular this implementation is for you if you have structs with several required fields and many optional ones. Examples of this might be query parameters for endpoints with required fields like a nonce and id, then many optional filtering parameters like start and end dates, price ranges, product types, etc. This macro was purpose built for this very use case.

Example: Simple Use Case

use simple_builder_macro::Builder;

// Debug, PartialEq, Eq are only for assertions
#[derive(Debug, PartialEq, Eq, Builder)]
struct Breakfast {
    #[builder(required)]
    pub coffee: i64, // coffee is required, and therefore not Option<T>
    pub toast: Option<i64>,
    pub eggs: Option<i64>,
    pub bacon: Option<i64>,
}

pub fn main() {
    let desired_breakfast = Breakfast {
        coffee: 1,
        toast: None,
        eggs: Some(3),
        bacon: Some(2),
    };
    
    // semantically equivalent to `Breakfast::builder(16)`
    let mut builder = BreakfastBuilder::new(16);
    let breakfast = builder.eggs(3).bacon(2).build();
    
    assert_eq!(desired_breakfast, breakfast);
}

Dependencies

~1–9MB
~80K SLoC