Skip to main content

uddf_sdk/entities/dive_computer/
builder.rs

1use 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
12/// Builder for creating `DiveComputer` instances.
13pub 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    /// Create a new `DiveComputerBuilder` instance.
24    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    /// Set the ID of the dive computer.
36    pub fn id(mut self, id: String) -> Self {
37        self.id = Some(id);
38        self
39    }
40
41    /// Set the name.
42    pub fn name(mut self, name: String) -> Self {
43        self.name = Some(name);
44        self
45    }
46
47    /// Set the model.
48    pub fn model(mut self, model: String) -> Self {
49        self.model = Some(model);
50        self
51    }
52
53    /// Set the manufacturer.
54    pub fn manufacturer(mut self, manufacturer: Manufacturer) -> Self {
55        self.manufacturer = Some(manufacturer);
56        self
57    }
58
59    /// Set the link.
60    pub fn link(mut self, link: Link) -> Self {
61        self.link = Some(link);
62        self
63    }
64
65    /// Set the serial number.
66    pub fn serial_number(mut self, serial_number: String) -> Self {
67        self.serial_number = Some(serial_number);
68        self
69    }
70
71    /// Build the final `DiveComputer` object.
72    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}