idanarye / rust-typed-builder

Compile-time type-checked builder derive
https://crates.io/crates/typed-builder
Apache License 2.0
922 stars 52 forks source link

Add flatten feature #81

Open poelzi opened 1 year ago

poelzi commented 1 year ago

It would be nice there is a builder(flatten) to merge 2 structs into one builder.

#[derive(TypedBuilder)]
struct A {
  a: String,
}
#[derive(TypedBuilder)]
struct A {
  #[builder(flatten)]
  shared: A,
  more: bool,
}

let a1 = A::builder().a("test".into()).more(true).build();

This should create a builder that will construct and fill the shared structure. Similar to serde(flatten). This is a common used data structure and would simplify usage.

idanarye commented 1 year ago

Sadly, I don't think this is possible with Rust's macro system. The derive macro on the outer type has no access to the structure of the inner types, and thus cannot generate withers for their fields.

mo8it commented 1 year ago

You would need to provide the fields of the struct to flatten, in this example: #[builder(flatten({a: String}))]. This could be automated with a macro that wraps both types, but it will get complicated and ugly...