uddf_sdk/entities/dive_computer/
builder.rs1use crate::entities::{link::structure::Link, manufacturer::structure::Manufacturer};
2
3use super::structure::DiveComputer;
4
5const MISSING_DIVE_COMPUTER_ID: &str = "Dive computer ID is required";
6const MISSING_DIVE_COMPUTER_MANUFACTURER_OR_LINK: &str =
7 "Dive computer manufacturer or link is required";
8
9const CONFLICTING_DIVE_COMPUTER_MANUFACTURER_AND_LINK: &str =
10 "Dive computer cannot have both manufacturer and link";
11
12pub struct DiveComputerBuilder {
14 id: Option<String>,
15 name: Option<String>,
16 model: Option<String>,
17 manufacturer: Option<Manufacturer>,
18 link: Option<Link>,
19 serial_number: Option<String>,
20}
21
22impl DiveComputerBuilder {
23 pub fn new() -> Self {
25 DiveComputerBuilder {
26 id: None,
27 name: None,
28 model: None,
29 manufacturer: None,
30 link: None,
31 serial_number: None,
32 }
33 }
34
35 pub fn id(mut self, id: String) -> Self {
37 self.id = Some(id);
38 self
39 }
40
41 pub fn name(mut self, name: String) -> Self {
43 self.name = Some(name);
44 self
45 }
46
47 pub fn model(mut self, model: String) -> Self {
49 self.model = Some(model);
50 self
51 }
52
53 pub fn manufacturer(mut self, manufacturer: Manufacturer) -> Self {
55 self.manufacturer = Some(manufacturer);
56 self
57 }
58
59 pub fn link(mut self, link: Link) -> Self {
61 self.link = Some(link);
62 self
63 }
64
65 pub fn serial_number(mut self, serial_number: String) -> Self {
67 self.serial_number = Some(serial_number);
68 self
69 }
70
71 pub fn build(self) -> Result<DiveComputer, &'static str> {
73 if self.manufacturer.is_some() && self.link.is_some() {
74 return Err(CONFLICTING_DIVE_COMPUTER_MANUFACTURER_AND_LINK);
75 }
76
77 if self.manufacturer.is_none() && self.link.is_none() {
78 return Err(MISSING_DIVE_COMPUTER_MANUFACTURER_OR_LINK);
79 }
80
81 Ok(DiveComputer {
82 id: self.id.ok_or(MISSING_DIVE_COMPUTER_ID)?,
83 name: self.name,
84 model: self.model,
85 manufacturer: self.manufacturer,
86 link: self.link,
87 serial_number: self.serial_number,
88 })
89 }
90}
91
92impl Default for DiveComputerBuilder {
93 fn default() -> Self {
94 Self::new()
95 }
96}