Rust macro (based on custom_derive) to automatically implement the builder pattern for arbitrary structs. A simple #[derive(Builder)] will generate code of public setter-methods for all struct fields.
This is a work in progress. Use it at your own risk.
And this is how it works:
```rust
customderive! { #[derive(Default, Builder)] struct Channel { token: i32, specialinfo: i32, // .. a whole bunch of other fields .. } }
impl Channel { // All that's left to do for you is writing a method, // which actually does something. :-) pub fn build(&self) -> String { format!("The meaning of life is {}.", self.special_info) } }
fn main() { // builder pattern, go, go, go!... let x = Channel::default().special_info(42u8).build(); println!("{:?}", x); } ```
Note that we did not write any implementation of a method called special_info. Instead the custom_derive! macro scans the #[derive(..)] attribute of the struct for non-std identifiers – in our case #[derive(Builder)] – and delegates the code generation to the Builder! macro defined in this crate.
The automatically generated setter method for the special_info field will look like this:
rust
pub fn special_info<VALUE: Into<i32>>(mut self, value: VALUE) -> Self {
self.special_info = value.into();
self
}
self.Into trait for the field type.VALUE, because this is already reserved for the setter-methods.#[cfg(...)] and #[allow(...)] attributes are also applied to the setter methods.VALUE as a generic parameter as this is what all setters are using.Builder!, make sure you don't use this name for another macro.#![recursion_limit="128"] to your crate (default is 64).The builder pattern is explained here, including its variants.
Yes, we keep a changelog.
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.