use camel_api::CamelError;
use camel_component_api::NetworkRetryPolicy;
#[derive(Debug, Clone)]
pub struct MasterUriConfig {
pub lock_name: String,
pub delegate_uri: String,
}
impl MasterUriConfig {
pub fn parse(uri: &str) -> Result<Self, CamelError> {
let mut parts = uri.splitn(3, ':');
let scheme = parts.next().unwrap_or_default();
let lock_name = parts.next().unwrap_or_default();
let delegate_uri = parts.next().unwrap_or_default();
if scheme != "master" || lock_name.is_empty() || delegate_uri.is_empty() {
return Err(CamelError::InvalidUri(format!(
"{uri}: expected master:<lockname>:<delegate-uri>"
)));
}
Ok(Self {
lock_name: lock_name.to_string(),
delegate_uri: delegate_uri.to_string(),
})
}
}
fn master_reconnect_default() -> NetworkRetryPolicy {
NetworkRetryPolicy {
max_attempts: 0, ..NetworkRetryPolicy::default()
}
}
#[derive(Debug, Clone)]
pub struct MasterComponentConfig {
pub drain_timeout_ms: u64,
pub reconnect: NetworkRetryPolicy,
pub delegate_retry_max_attempts: Option<u32>,
}
impl MasterComponentConfig {
pub fn new(drain_timeout_ms: u64, delegate_retry_max_attempts: Option<u32>) -> Self {
Self {
drain_timeout_ms,
reconnect: master_reconnect_default(),
delegate_retry_max_attempts,
}
}
}
impl Default for MasterComponentConfig {
fn default() -> Self {
Self {
drain_timeout_ms: 5000,
reconnect: master_reconnect_default(),
delegate_retry_max_attempts: None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn master_config_has_reconnect_policy() {
let cfg = MasterComponentConfig::default();
assert_eq!(cfg.reconnect.max_attempts, 0);
assert!(cfg.reconnect.enabled);
assert_eq!(cfg.delegate_retry_max_attempts, None);
}
#[test]
fn master_config_default_reconnect_is_unlimited() {
let policy = master_reconnect_default();
assert_eq!(policy.max_attempts, 0);
assert!(policy.enabled);
assert!(policy.should_retry(0));
assert!(policy.should_retry(100));
assert!(policy.should_retry(10_000));
}
#[test]
fn master_config_new_preserves_drain_timeout() {
let cfg = MasterComponentConfig::new(10_000, Some(5));
assert_eq!(cfg.drain_timeout_ms, 10_000);
}
}