gander-bin 0.6.5

Executable entry point for gander, a cross-platform interactive process viewer (htop alternative) for Linux, macOS and FreeBSD.
use std::path::PathBuf;

struct TempDir(PathBuf);

impl Drop for TempDir {
    fn drop(&mut self) {
        let _ = std::fs::remove_dir_all(&self.0);
    }
}

#[test]
fn bad_config_exits_with_a_diagnostic_without_overwriting_it() {
    let dir = TempDir(std::env::temp_dir().join(format!(
        "gander-cli-config-{}-{}", std::process::id(),
        std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_nanos()
    )));
    std::fs::create_dir(&dir.0).unwrap();
    let path = dir.0.join("config.toml");
    for text in ["delay_ms = [", "tabs = []", "active_tab = 99"] {
        std::fs::write(&path, text).unwrap();
        let output = std::process::Command::new(env!("CARGO_BIN_EXE_gander"))
            .env("GANDER_CONFIG", &path)
            .args(["--json", "--limit", "0"])
            .output()
            .unwrap();
        assert_eq!(output.status.code(), Some(1));
        assert!(output.stdout.is_empty());
        let error = String::from_utf8_lossy(&output.stderr);
        assert!(error.contains("cannot load config"), "{error}");
        assert!(error.contains(path.to_str().unwrap()), "{error}");
        assert!(!error.contains("panicked"), "{error}");
        assert_eq!(std::fs::read_to_string(&path).unwrap(), text);
    }
}