use std::sync::atomic::{AtomicBool, Ordering};
#[repr(i32)]
pub enum ExitCode {
NoResults = 2,
GateFailed = 3,
Interrupted = 130,
}
static INTERRUPTED: AtomicBool = AtomicBool::new(false);
pub fn setup_signal_handler() {
if let Err(e) = ctrlc::set_handler(|| {
if INTERRUPTED.swap(true, Ordering::AcqRel) {
std::process::exit(ExitCode::Interrupted as i32);
}
eprintln!("\nInterrupted. Finishing current batch...");
}) {
tracing::warn!(error = %e, "Failed to set Ctrl+C handler");
}
}
pub fn check_interrupted() -> bool {
INTERRUPTED.load(Ordering::Acquire)
}
pub fn reset_interrupted() {
INTERRUPTED.store(false, Ordering::Release);
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_reset_interrupted_clears_flag() {
INTERRUPTED.store(true, Ordering::Release);
assert!(check_interrupted());
reset_interrupted();
assert!(!check_interrupted());
}
}