#[derive(Debug, Clone)]
pub struct WorkerSettings {
pub worker_id: String,
pub lease_ttl_secs: i64,
pub runtime_label: String,
pub worker_pools: Option<Vec<String>>,
pub worker_poll_interval_ms: u64,
pub skip_run_persistence: bool,
}
impl WorkerSettings {
#[must_use]
pub fn embedded() -> Self {
Self {
worker_id: resolve_worker_id_from_env(),
lease_ttl_secs: 0,
runtime_label: "embedded".into(),
worker_pools: resolve_worker_pools_from_env(),
worker_poll_interval_ms: resolve_worker_poll_interval_from_env(),
skip_run_persistence: resolve_skip_run_persistence_from_env(),
}
}
pub fn resolve(
worker_id: Option<String>,
lease_ttl_secs: Option<i64>,
runtime_label: Option<String>,
worker_pools: Option<Vec<String>>,
worker_poll_interval_ms: Option<u64>,
) -> Self {
Self {
worker_id: worker_id.unwrap_or_else(resolve_worker_id_from_env),
lease_ttl_secs: lease_ttl_secs.unwrap_or_else(resolve_lease_ttl_from_env),
runtime_label: runtime_label.unwrap_or_else(|| "embedded".to_string()),
worker_pools: worker_pools.or_else(resolve_worker_pools_from_env),
worker_poll_interval_ms: worker_poll_interval_ms
.unwrap_or_else(resolve_worker_poll_interval_from_env),
skip_run_persistence: resolve_skip_run_persistence_from_env(),
}
}
#[must_use]
pub fn pools_to_poll(&self, discovered: Vec<String>) -> Vec<String> {
match &self.worker_pools {
Some(pools) if !pools.is_empty() => pools.clone(),
_ => discovered,
}
}
}
fn resolve_worker_id_from_env() -> String {
std::env::var("INSTANCE_ID")
.or_else(|_| std::env::var("BOSON_WORKER_ID"))
.unwrap_or_else(|_| "boson-worker-1".to_string())
}
fn resolve_lease_ttl_from_env() -> i64 {
std::env::var("BOSON_LEASE_TTL_SECS")
.ok()
.and_then(|s| s.parse().ok())
.unwrap_or(0)
}
fn resolve_worker_pools_from_env() -> Option<Vec<String>> {
std::env::var("BOSON_WORKER_POOLS")
.ok()
.map(|s| {
s.split(',')
.map(str::trim)
.filter(|p| !p.is_empty())
.map(ToString::to_string)
.collect()
})
.filter(|pools: &Vec<String>| !pools.is_empty())
}
fn resolve_worker_poll_interval_from_env() -> u64 {
std::env::var("BOSON_WORKER_POLL_MS")
.ok()
.and_then(|s| s.parse().ok())
.unwrap_or(50)
}
fn resolve_skip_run_persistence_from_env() -> bool {
std::env::var("BOSON_SKIP_RUN_ROWS")
.ok()
.is_some_and(|v| matches!(v.to_ascii_lowercase().as_str(), "1" | "true" | "yes"))
}