use crate::{client::Client, NoDelay, NoPin};
pub struct ClientBuilder<S, TX, D = NoDelay> {
pub(crate) serial: S,
pub(crate) tx_en: TX,
pub(crate) rtu_timeout_ms: Option<u32>,
pub(crate) tcp_timeout_ms: Option<u32>,
pub(crate) delay: D,
}
impl ClientBuilder<(), (), NoDelay> {
pub fn new() -> Self {
Self {
serial: (),
tx_en: (),
rtu_timeout_ms: None,
tcp_timeout_ms: None,
delay: NoDelay,
}
}
}
impl Default for ClientBuilder<(), (), NoDelay> {
fn default() -> Self {
Self::new()
}
}
impl<D> ClientBuilder<(), (), D> {
pub fn rtu<S, TX>(self, serial: S, tx_en: TX) -> ClientBuilder<S, TX, D> {
ClientBuilder {
serial,
tx_en,
rtu_timeout_ms: self.rtu_timeout_ms,
tcp_timeout_ms: self.tcp_timeout_ms,
delay: self.delay,
}
}
pub fn rtu_no_pin<S>(self, serial: S) -> ClientBuilder<S, NoPin, D> {
ClientBuilder {
serial,
tx_en: NoPin,
rtu_timeout_ms: self.rtu_timeout_ms,
tcp_timeout_ms: self.tcp_timeout_ms,
delay: self.delay,
}
}
}
impl<S, TX, D> ClientBuilder<S, TX, D> {
pub fn rtu_timeout(mut self, ms: u32) -> Self {
self.rtu_timeout_ms = Some(ms);
self
}
pub fn tcp_timeout(mut self, ms: u32) -> Self {
self.tcp_timeout_ms = Some(ms);
self
}
pub fn build(self) -> Client<S, TX, D> {
Client::from_parts(
self.serial,
self.tx_en,
self.delay,
self.rtu_timeout_ms,
self.tcp_timeout_ms,
)
}
}
impl<S, TX> ClientBuilder<S, TX, NoDelay> {
pub fn delay<D2>(self, delay: D2) -> ClientBuilder<S, TX, D2> {
ClientBuilder {
serial: self.serial,
tx_en: self.tx_en,
rtu_timeout_ms: self.rtu_timeout_ms,
tcp_timeout_ms: self.tcp_timeout_ms,
delay,
}
}
}