#[derive(Debug, Clone)]
pub struct Keyspace {
prefix: String,
}
impl Keyspace {
#[must_use]
pub fn from_env() -> Self {
Self::new(
std::env::var("BOSON_REDIS_KEY_PREFIX").unwrap_or_else(|_| "boson".into()),
)
}
#[must_use]
pub fn new(prefix: impl Into<String>) -> Self {
Self {
prefix: prefix.into(),
}
}
#[must_use]
pub fn isolated(prefix: &str) -> Self {
Self::new(format!("{prefix}_{}", uuid::Uuid::new_v4().simple()))
}
#[must_use]
pub fn job_pattern(&self) -> String {
format!("{}:job:*", self.prefix)
}
#[must_use]
pub fn run_pattern(&self) -> String {
format!("{}:run:*", self.prefix)
}
#[must_use]
pub fn lease_pattern(&self) -> String {
format!("{}:lease:*", self.prefix)
}
#[must_use]
pub fn scan_pattern(&self) -> String {
format!("{}:*", self.prefix)
}
#[must_use]
pub fn job(&self, id: &str) -> String {
format!("{}:job:{}", self.prefix, id)
}
#[must_use]
pub fn job_key_prefix(&self) -> String {
format!("{}:job:", self.prefix)
}
#[must_use]
pub fn ready(&self, pool: &str) -> String {
format!("{}:ready:{}", self.prefix, pool)
}
#[must_use]
pub fn idempotency(&self, key: &str) -> String {
format!("{}:idem:{}", self.prefix, key)
}
#[must_use]
pub fn run(&self, id: &str) -> String {
format!("{}:run:{}", self.prefix, id)
}
#[must_use]
pub fn task_config(&self, name: &str) -> String {
format!("{}:taskcfg:{}", self.prefix, name)
}
#[must_use]
pub fn lease(&self, id: &str) -> String {
format!("{}:lease:{}", self.prefix, id)
}
#[must_use]
pub fn lease_by_job(&self, job_id: &str) -> String {
format!("{}:lease-by-job:{}", self.prefix, job_id)
}
#[must_use]
pub fn pools_set(&self) -> String {
format!("{}:pools", self.prefix)
}
}
#[must_use]
#[allow(clippy::cast_precision_loss)] pub fn ready_score(priority: i32, created_at_ms: i64) -> f64 {
(i64::from(priority) as f64).mul_add(1e15, created_at_ms as f64)
}