use codec::utils::random_string;
use codec::ProtocolLevel;
use std::net::SocketAddr;
use std::path::PathBuf;
use std::time::Duration;
#[derive(Clone, Debug)]
pub struct HttpProxy {
pub hostname: String,
pub port: u16,
pub login: String,
pub password: String,
}
#[derive(Clone, Debug)]
pub struct Socks5Proxy {
pub hostname: String,
pub port: u16,
pub login: String,
pub password: String,
}
#[derive(Clone, Debug)]
pub enum Proxy {
None,
Http(HttpProxy),
Socks5(Socks5Proxy),
}
#[derive(Clone, Debug)]
pub struct UsernameAuth {
pub username: String,
pub password: String,
}
#[derive(Clone, Debug)]
pub struct SelfSignedTls {
pub cert: PathBuf,
}
#[derive(Clone, Debug)]
pub enum TlsType {
CASigned,
SelfSigned(SelfSignedTls),
}
#[derive(Clone, Debug)]
pub struct MqttConnect {
pub address: SocketAddr,
}
#[derive(Clone, Debug)]
pub struct MqttsConnect {
pub address: SocketAddr,
pub domain: String,
pub tls_type: TlsType,
}
#[derive(Clone, Debug)]
pub struct WsConnect {
pub address: SocketAddr,
pub path: String,
}
#[derive(Clone, Debug)]
pub struct WssConnect {
pub address: SocketAddr,
pub domain: String,
pub tls_type: TlsType,
pub path: String,
}
#[cfg(unix)]
#[derive(Clone, Debug)]
pub struct UdsConnect {
pub sock_path: PathBuf,
}
#[derive(Clone, Debug)]
pub struct QuicConnect {
pub client_address: SocketAddr,
pub server_address: SocketAddr,
pub domain: String,
pub tls_type: TlsType,
}
#[derive(Clone, Debug)]
pub enum ConnectType {
Mqtt(MqttConnect),
Mqtts(MqttsConnect),
Ws(WsConnect),
Wss(WssConnect),
#[cfg(unix)]
Uds(UdsConnect),
Quic(QuicConnect),
}
#[derive(Clone, Debug)]
pub struct ConnectOptions {
protocol_level: ProtocolLevel,
connect_type: ConnectType,
client_id: String,
keep_alive: Duration,
connect_timeout: Duration,
proxy: Proxy,
}
impl Default for ConnectOptions {
fn default() -> Self {
let client_id = "ruo".to_owned() + &random_string(8);
Self {
protocol_level: ProtocolLevel::V4,
connect_type: ConnectType::Mqtt(MqttConnect {
address: SocketAddr::from(([127, 0, 0, 1], 1883)),
}),
client_id,
connect_timeout: Duration::from_secs(10),
keep_alive: Duration::from_secs(60),
proxy: Proxy::None,
}
}
}
impl ConnectOptions {
#[must_use]
pub fn new() -> Self {
Self::default()
}
pub fn set_protocol_level(&mut self, protocol_level: ProtocolLevel) -> &mut Self {
self.protocol_level = protocol_level;
self
}
#[must_use]
pub const fn protocol_level(&self) -> ProtocolLevel {
self.protocol_level
}
pub fn set_connect_type(&mut self, connect_type: ConnectType) -> &mut Self {
self.connect_type = connect_type;
self
}
#[must_use]
pub const fn connect_type(&self) -> &ConnectType {
&self.connect_type
}
pub fn set_client_id(&mut self, client_id: &str) -> &mut Self {
self.client_id = client_id.to_string();
self
}
#[must_use]
pub fn client_id(&self) -> &str {
&self.client_id
}
pub fn set_connect_timeout(&mut self, connect_timeout: Duration) -> &mut Self {
self.connect_timeout = connect_timeout;
self
}
#[must_use]
pub const fn connect_timeout(&self) -> &Duration {
&self.connect_timeout
}
pub fn set_keepalive(&mut self, keep_alive: Duration) -> &mut Self {
self.keep_alive = keep_alive;
self
}
#[must_use]
pub const fn keep_alive(&self) -> &Duration {
&self.keep_alive
}
pub fn set_proxy(&mut self, proxy: Proxy) -> &mut Self {
self.proxy = proxy;
self
}
#[must_use]
pub const fn proxy(&self) -> &Proxy {
&self.proxy
}
}