use std::sync::Arc;
use std::time::Duration;
use crate::bus_timing::BusTiming;
use crate::reconnect::ReconnectConfig;
use crate::wire_tap::WireTap;
#[derive(Clone)]
pub struct ClientOptions {
pub(crate) timeout: Duration,
pub(crate) tap: Option<Arc<dyn WireTap>>,
pub(crate) reconnect: Option<ReconnectConfig>,
pub(crate) bus_timing: Option<Arc<BusTiming>>,
pub(crate) data_channel_capacity: Option<usize>,
pub(crate) tap_channel_capacity: Option<usize>,
}
impl Default for ClientOptions {
fn default() -> Self {
Self {
timeout: Duration::from_secs(1),
tap: None,
reconnect: None,
bus_timing: Some(Arc::new(BusTiming::rtu_35t(9600))),
data_channel_capacity: None,
tap_channel_capacity: None,
}
}
}
impl ClientOptions {
pub fn new() -> Self {
Self::default()
}
pub fn timeout(&self) -> Duration {
self.timeout
}
pub fn reconnect(&self) -> Option<&ReconnectConfig> {
self.reconnect.as_ref()
}
pub fn bus_timing(&self) -> Option<&Arc<BusTiming>> {
self.bus_timing.as_ref()
}
pub fn tap(&self) -> Option<&Arc<dyn WireTap>> {
self.tap.as_ref()
}
pub fn with_timeout(mut self, timeout: Duration) -> Self {
self.timeout = timeout;
self
}
pub fn with_tap(mut self, tap: Arc<dyn WireTap>) -> Self {
self.tap = Some(tap);
self
}
pub fn with_reconnect(mut self, max_retries: u32, interval: Duration) -> Self {
self.reconnect = Some(ReconnectConfig::new(max_retries, interval));
self
}
pub fn with_bus_timing(mut self, timing: BusTiming) -> Self {
self.bus_timing = Some(Arc::new(timing));
self
}
pub fn with_data_channel_capacity(mut self, bytes: usize) -> Self {
self.data_channel_capacity = Some(bytes);
self
}
pub fn with_tap_channel_capacity(mut self, bytes: usize) -> Self {
self.tap_channel_capacity = Some(bytes);
self
}
}