#[cfg(unix)]
use crate::core::{apply_filters, parse_targets, resolve_targets_excluding_self};
use crate::error::{ProcError, Result};
#[cfg(unix)]
use crate::ui::Printer;
use clap::Args;
#[derive(Args, Debug)]
pub struct FreezeCommand {
#[arg(required = true)]
pub target: String,
#[arg(long, short = 'y')]
pub yes: bool,
#[arg(long)]
pub dry_run: bool,
#[arg(long, short = 'j')]
pub json: bool,
#[arg(long, short = 'v')]
pub verbose: bool,
#[arg(long = "in", short = 'i', num_args = 0..=1, default_missing_value = ".")]
pub in_dir: Option<String>,
#[arg(long = "by", short = 'b')]
pub by_name: Option<String>,
}
impl FreezeCommand {
#[cfg(unix)]
pub fn execute(&self) -> Result<()> {
use nix::sys::signal::Signal;
let printer = Printer::from_flags(self.json, self.verbose);
let targets = parse_targets(&self.target);
let (mut processes, not_found) = resolve_targets_excluding_self(&targets);
if !not_found.is_empty() {
printer.warning(&format!("Not found: {}", not_found.join(", ")));
}
apply_filters(&mut processes, &self.in_dir, &self.by_name);
if processes.is_empty() {
return Err(ProcError::ProcessNotFound(self.target.clone()));
}
if self.dry_run {
printer.print_dry_run("freeze", &processes);
return Ok(());
}
if !printer.ask_confirm("freeze", &processes, self.yes)? {
return Ok(());
}
let mut succeeded = Vec::new();
let mut failed = Vec::new();
for proc in &processes {
match proc.send_signal(Signal::SIGSTOP) {
Ok(()) => succeeded.push(proc.clone()),
Err(e) => failed.push((proc.clone(), e.to_string())),
}
}
printer.print_action_result("freeze", &succeeded, &failed);
Ok(())
}
#[cfg(not(unix))]
pub fn execute(&self) -> Result<()> {
Err(ProcError::NotSupported(
"freeze (SIGSTOP) is not supported on Windows".to_string(),
))
}
}