Update with Playground Builder Code
Today I took a look at an interesting post related to JavaScript and the Builder Pattern

JavaScript Design Patterns - Builder
Coderslang: Become a Software Engineer ・ Jun 12 ・ 5 min read
This got me wondering about Rust and the Builder Pattern
This lead me to some interesting articles on the topic.
I presently have no opinion myself as I am rather new. But I was hoping some others with more experience might venture their opinions. It seems people are a bit split about the use of the Builder Pattern in rust.
You can access the Playound
The Gist
I used the following sample from Rust Unoffical as a starting point.
The code if you just want to see it:
#![allow(unused)] #[derive(Debug, Clone)] pub struct OTG<'a> { model: String, title: &'a str, color: String, max_temperature:u8, max_time_selection:u8, } impl<'a> Default for OTG<'a> { fn default() -> OTG<'a> { OTG { model: String::new(), title: "OTG", color: String::new(), max_temperature: 150, max_time_selection: 30, } } } impl<'a, 'b> OTG<'a> { fn new(model: String, color: String) -> Self { Self { model, color, ..OTG::default() } } pub fn builder() -> OTGBuilder<'b> { OTGBuilder::default() } } #[derive(Default, Clone)] pub struct OTGBuilder<'b> { model: String, title: &'b str, color: String, max_temperature:u8, max_time_selection: u8 } impl<'b> OTGBuilder<'b> { pub fn new() -> Self { Self { model: String::new(), color: String::new(), title: "OTG", max_temperature: 150, max_time_selection: 30, } } pub fn model(mut self, model: String) -> OTGBuilder<'b> { self.model = model; self } pub fn color(mut self, color: String) -> OTGBuilder<'b> { self.color = color; self } pub fn set_temp(mut self, temp: u8) -> OTGBuilder<'b> { self.max_temperature = temp; self } pub fn set_time(mut self, time:u8) -> OTGBuilder<'b> { self.max_time_selection = time; self } pub fn build(self) -> OTG<'b> { OTG { model: self.model.to_string(), color: self.color.to_string(), max_temperature: self.max_temperature, max_time_selection: self.max_time_selection, ..OTG::default() } } } fn main() { let otg = OTG::new("LG".to_string(), "Red".to_string()); println!("Model: {}, Color: {} Temp: {}, Time: {}", otg.model, otg.color, otg.max_temperature, otg.max_time_selection ); let otg_builder1: OTG = OTGBuilder::new() .model(String::from("Builder1")) .color("Red".to_string()).build(); println!("Model: {}, Color: {} Temp: {}, Time: {}", otg_builder1.model, otg_builder1.color, otg_builder1.max_temperature, otg_builder1.max_time_selection ); let otg_builder2: OTG = OTGBuilder::new() .model(String::from("Builder1")) .color("Red".to_string()) .set_temp(80).build(); println!("Model: {}, Color: {} Temp: {}, Time: {}", otg_builder2.model, otg_builder2.color, otg_builder2.max_temperature, otg_builder2.max_time_selection ); let otg_builder3: OTG = OTGBuilder::new() .model(String::from("Builder1")) .color("Red".to_string()) .set_temp(80) .set_time(50).build(); println!("Model: {}, Color: {} Temp: {}, Time: {}", otg_builder3.model, otg_builder3.color, otg_builder3.max_temperature, otg_builder3.max_time_selection ); let otg_builder4: OTG = OTGBuilder::new() .model(String::from("Builder1")) .color("Red".to_string()) .set_time(50).build(); println!("Model: {}, Color: {} Temp: {}, Time: {}", otg_builder4.model, otg_builder4.color, otg_builder4.max_temperature, otg_builder4.max_time_selection ); }
Looking forward to any comments and or responses.
Top comments (0)