malvin 0.2.5

Non-interactive research and coding agent
use std::io::Write;
use std::path::Path;

pub fn log_herdr_failure(run_dir: Option<&Path>, phase: &str, detail: &str) {
    let Some(dir) = run_dir else {
        return;
    };
    let path = dir.join("herdr.log");
    let line = format!("herdr {phase} failed: {detail}\n");
    let _ = std::fs::OpenOptions::new()
        .create(true)
        .append(true)
        .open(path)
        .and_then(|mut f| f.write_all(line.as_bytes()));
}

#[cfg(test)]
mod tests {
    use super::log_herdr_failure;
    use tempfile::tempdir;

    #[test]
    fn log_herdr_failure_appends_line() {
        let dir = tempdir().expect("tempdir");
        log_herdr_failure(None, "bind", "ignored");
        log_herdr_failure(Some(dir.path()), "bind", "socket error");
        let text = std::fs::read_to_string(dir.path().join("herdr.log")).expect("read");
        assert!(text.contains("herdr bind failed: socket error"), "{text}");
    }
}