use std::path::PathBuf;
use std::time::Duration;
use crate::credentials::Credentials;
use super::DEFAULT_COMMAND_TIMEOUT;
#[derive(Clone, Default)]
pub(super) enum TlsConfig {
#[default]
Disabled,
SystemRoots,
CaCert { ca_cert_path: PathBuf },
}
impl std::fmt::Debug for TlsConfig {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Disabled => write!(f, "Disabled"),
Self::SystemRoots => write!(f, "SystemRoots"),
Self::CaCert { .. } => f
.debug_struct("CaCert")
.field("ca_cert_path", &"[REDACTED]")
.finish(),
}
}
}
#[derive(Clone)]
pub struct MqttBrokerConfig {
pub(super) host: String,
pub(super) port: u16,
pub(super) credentials: Option<Credentials>,
pub(super) keep_alive: Duration,
pub(super) connection_timeout: Duration,
pub(super) command_timeout: Duration,
pub(super) tls: TlsConfig,
}
impl std::fmt::Debug for MqttBrokerConfig {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("MqttBrokerConfig")
.field("host", &self.host)
.field("port", &self.port)
.field("credentials", &self.credentials)
.field("keep_alive", &self.keep_alive)
.field("connection_timeout", &self.connection_timeout)
.field("command_timeout", &self.command_timeout)
.field("tls", &self.tls)
.finish()
}
}
impl Default for MqttBrokerConfig {
fn default() -> Self {
Self {
host: String::new(),
port: 1883,
credentials: None,
keep_alive: Duration::from_secs(30),
connection_timeout: Duration::from_secs(10),
command_timeout: DEFAULT_COMMAND_TIMEOUT,
tls: TlsConfig::Disabled,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn config_default() {
let config = MqttBrokerConfig::default();
assert!(config.host.is_empty());
assert_eq!(config.port, 1883);
assert!(config.credentials.is_none());
}
}