idanarye / rust-typed-builder

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

Mutators as a path among others #130

Open AlexandreCassagne opened 9 months ago

AlexandreCassagne commented 9 months ago

I have an example use case that either does not work currently, or I am deeply misunderstanding the documentation ;-)

#[derive(Debug, TypedBuilder)]
struct CalendarEvent<Tz: chrono::offset::TimeZone> {
    #[builder(setter(into))]
    title: String,

    // Goal: User should be able to set start(...), then may EITHER:
    //   - set end(...)
    //   - call with_duration(chrono::Duration) which would automatically add duration to start and set end.
    #[builder(
      mutators(
        fn with_duration(&mut self, duration: chrono::Duration) {
            self.end = self.start.clone().checked_add_signed(duration).unwrap();
        }
      )
    )]
    start: chrono::DateTime<Tz>,
    #[builder(???)]
    end: chrono::DateTime<Tz>,
}

The "goal" comment describes the use case, i.e. two different paths to the completed builder.

Of course, there may be multiple other paths.

I have tried several combinations but none work. Is it because I am using generics? Or am I trying to do something that is currently unsupported?

idanarye commented 9 months ago

Mutators change the value of the builder payload, but they cannot change its type. Having mutators that can change the type is a more complex feature (which would also require more complex syntax) that is not currently implemented.