use std::time::Duration;
pub(crate) fn get_host() -> Option<String> {
if let Ok(host) = std::env::var("KUBEMQ_HOST") {
return Some(host);
}
if let Some((host, _)) = get_address() {
return Some(host);
}
None
}
pub(crate) fn get_port() -> Option<u16> {
if let Ok(port_str) = std::env::var("KUBEMQ_PORT") {
if let Ok(port) = port_str.parse::<u16>() {
return Some(port);
}
}
if let Some((_, port)) = get_address() {
return Some(port);
}
None
}
pub(crate) fn get_client_id() -> Option<String> {
std::env::var("KUBEMQ_CLIENT_ID").ok()
}
pub(crate) fn get_auth_token() -> Option<String> {
std::env::var("KUBEMQ_AUTH_TOKEN").ok()
}
pub(crate) fn get_tls_cert_file() -> Option<String> {
std::env::var("KUBEMQ_TLS_CERT_FILE").ok()
}
pub(crate) fn get_tls_cert_data() -> Option<String> {
std::env::var("KUBEMQ_TLS_CERT_DATA").ok()
}
pub(crate) fn get_tls_client_cert() -> Option<String> {
std::env::var("KUBEMQ_TLS_CLIENT_CERT").ok()
}
pub(crate) fn get_tls_client_key() -> Option<String> {
std::env::var("KUBEMQ_TLS_CLIENT_KEY").ok()
}
pub(crate) fn get_max_receive_size() -> Option<usize> {
std::env::var("KUBEMQ_MAX_RECEIVE_SIZE")
.ok()
.and_then(|s| s.parse().ok())
}
pub(crate) fn get_connection_timeout() -> Option<Duration> {
parse_duration_env("KUBEMQ_CONNECTION_TIMEOUT")
}
pub(crate) fn get_keepalive_time() -> Option<Duration> {
parse_duration_env("KUBEMQ_KEEPALIVE_TIME")
}
pub(crate) fn get_keepalive_timeout() -> Option<Duration> {
parse_duration_env("KUBEMQ_KEEPALIVE_TIMEOUT")
}
fn get_address() -> Option<(String, u16)> {
let addr = std::env::var("KUBEMQ_ADDRESS")
.or_else(|_| std::env::var("KUBEMQ_BROKER_ADDRESS"))
.ok()?;
parse_address(&addr)
}
fn parse_address(addr: &str) -> Option<(String, u16)> {
let (host, port_str) = addr.rsplit_once(':')?;
let port = port_str.parse::<u16>().ok()?;
Some((host.to_string(), port))
}
fn parse_duration_env(var: &str) -> Option<Duration> {
let val = std::env::var(var).ok()?;
parse_duration_str(&val)
}
fn parse_duration_str(s: &str) -> Option<Duration> {
let s = s.trim();
if let Some(secs) = s.strip_suffix('s') {
if let Some(ms) = secs.strip_suffix('m') {
ms.parse::<u64>().ok().map(Duration::from_millis)
} else {
secs.parse::<u64>().ok().map(Duration::from_secs)
}
} else if let Some(mins) = s.strip_suffix('m') {
mins.parse::<u64>()
.ok()
.map(|m| Duration::from_secs(m * 60))
} else {
s.parse::<u64>().ok().map(Duration::from_secs)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_address() {
assert_eq!(
parse_address("localhost:50000"),
Some(("localhost".to_string(), 50000))
);
assert_eq!(
parse_address("192.168.1.1:8080"),
Some(("192.168.1.1".to_string(), 8080))
);
assert_eq!(parse_address("noport"), None);
assert_eq!(parse_address("host:notaport"), None);
}
#[test]
fn test_parse_duration_str() {
assert_eq!(parse_duration_str("10s"), Some(Duration::from_secs(10)));
assert_eq!(
parse_duration_str("100ms"),
Some(Duration::from_millis(100))
);
assert_eq!(parse_duration_str("5m"), Some(Duration::from_secs(300)));
assert_eq!(parse_duration_str("30"), Some(Duration::from_secs(30)));
assert_eq!(parse_duration_str("invalid"), None);
}
}