use crate::process::config::ProcessConfig;
use crate::process::Process;
use crate::process::ProcessError;
use crate::process::ProcessResult;
use std::collections::HashMap;
#[derive(Debug)]
pub struct ProcessManager {
processes: HashMap<String, Process>,
}
impl ProcessManager {
pub fn new() -> Self {
Self {
processes: HashMap::new(),
}
}
pub fn register(&mut self, process_name: &str) -> ProcessResult<()> {
if self.processes.contains_key(process_name) {
return Err(ProcessError::DuplicateName(process_name.to_string()));
}
let config = ProcessConfig::new(process_name);
let process = Process::new(config);
self.processes.insert(process_name.to_string(), process);
Ok(())
}
pub fn register_alias(&mut self, key: &str, process_name: &str) -> ProcessResult<()> {
if self.processes.contains_key(key) {
return Err(ProcessError::DuplicateName(key.to_string()));
}
let config = ProcessConfig::new(process_name);
let process = Process::new(config);
self.processes.insert(key.to_string(), process);
Ok(())
}
pub fn register_config(&mut self, config: ProcessConfig) -> ProcessResult<()> {
let process_name = config.process_name.clone();
if self.processes.contains_key(&process_name) {
return Err(ProcessError::DuplicateName(process_name));
}
let process = Process::new(config);
self.processes.insert(process_name, process);
Ok(())
}
pub fn register_config_alias(&mut self, key: &str, config: ProcessConfig) -> ProcessResult<()> {
if self.processes.contains_key(key) {
return Err(ProcessError::DuplicateName(key.to_string()));
}
let process = Process::new(config);
self.processes.insert(key.to_string(), process);
Ok(())
}
pub fn unregister(&mut self, key: &str) -> ProcessResult<()> {
if let Some(mut process) = self.processes.remove(key) {
process.cleanup()?;
} else {
return Err(ProcessError::ProcessNotRegistered(key.to_string()));
}
Ok(())
}
pub fn is_registered(&self, key: &str) -> bool {
self.processes.contains_key(key)
}
pub fn init(&mut self, key: &str) -> ProcessResult<()> {
if let Some(proc) = self.processes.get_mut(key) {
proc.init()?;
} else {
return Err(ProcessError::ProcessNotRegistered(key.to_string()));
}
Ok(())
}
pub fn init_with_pid(&mut self, key: &str, pid: u32) -> ProcessResult<()> {
if let Some(proc) = self.processes.get_mut(key) {
proc.init_with_pid(pid)?;
} else {
return Err(ProcessError::ProcessNotRegistered(key.to_string()));
}
Ok(())
}
pub fn reinit(&mut self, key: &str) -> ProcessResult<()> {
if let Some(proc) = self.processes.get_mut(key) {
proc.reinit()?;
} else {
return Err(ProcessError::ProcessNotRegistered(key.to_string()));
}
Ok(())
}
pub fn cleanup(&mut self, key: &str) -> ProcessResult<()> {
if let Some(proc) = self.processes.get_mut(key) {
proc.cleanup()?;
} else {
return Err(ProcessError::ProcessNotRegistered(key.to_string()));
}
Ok(())
}
pub fn cleanup_all(&mut self) -> ProcessResult<()> {
for proc in self.processes.values_mut() {
proc.cleanup()?;
}
Ok(())
}
pub fn get(&self, key: &str) -> Option<&Process> {
self.processes.get(key)
}
pub fn list_processes(&self) -> Vec<String> {
self.processes.keys().cloned().collect()
}
pub fn get_all_valid(&self) -> Vec<(String, bool)> {
self.processes.iter()
.filter(|(_, p)| p.is_valid())
.map(|(name, proc)| (name.clone(), proc.is_valid()))
.collect()
}
pub fn get_all_registered(&self) -> Vec<String> {
self.list_processes()
}
}
impl Default for ProcessManager {
fn default() -> Self {
Self::new()
}
}
impl Drop for ProcessManager {
fn drop(&mut self) {
let _ = self.cleanup_all();
}
}