use crate::domain::PipelineStage;
use std::collections::HashSet;
use std::sync::{Arc, RwLock};
#[derive(Clone, Default)]
pub struct PipelineManager {
running: Arc<RwLock<HashSet<(i64, PipelineStage)>>>,
}
impl PipelineManager {
pub fn new() -> Self {
Self {
running: Arc::new(RwLock::new(HashSet::new())),
}
}
fn read_set(&self) -> HashSet<(i64, PipelineStage)> {
self.running
.read()
.unwrap_or_else(|e| e.into_inner())
.clone()
}
pub fn is_running(&self, site_id: i64, stage: PipelineStage) -> bool {
self.running
.read()
.unwrap_or_else(|e| e.into_inner())
.contains(&(site_id, stage))
}
pub fn start(&self, site_id: i64, stage: PipelineStage) -> bool {
self.running
.write()
.unwrap_or_else(|e| e.into_inner())
.insert((site_id, stage))
}
pub fn stop(&self, site_id: i64, stage: PipelineStage) -> bool {
self.running
.write()
.unwrap_or_else(|e| e.into_inner())
.remove(&(site_id, stage))
}
pub fn running_sites_for_stage(&self, stage: PipelineStage) -> Vec<i64> {
let set = self.read_set();
let mut sites: Vec<i64> = set
.into_iter()
.filter_map(|(s_id, s_stage)| if s_stage == stage { Some(s_id) } else { None })
.collect();
sites.sort_unstable();
sites.dedup();
sites
}
pub fn running_stages(&self, site_id: i64) -> Vec<PipelineStage> {
let set = self.read_set();
PipelineStage::ALL
.into_iter()
.filter(|stage| set.contains(&(site_id, *stage)))
.collect()
}
}