use std::fs;
use std::io::Write;
use std::path::Path;
pub fn write_evidence_marker(path: Option<&Path>, line: &str) {
let Some(path) = path else {
return;
};
let mut file = fs::OpenOptions::new()
.create(true)
.append(true)
.open(path)
.unwrap_or_else(|error| panic!("open evidence file {}: {error}", path.display()));
writeln!(file, "{line}").expect("write evidence marker");
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn none_path_touches_nothing() {
let dir = tempfile::tempdir().expect("tempdir");
let untouched = dir.path().join("evidence.txt");
write_evidence_marker(None, "executed");
assert!(
!untouched.exists(),
"write_evidence_marker(None, ..) must not create a file"
);
}
#[test]
fn some_path_creates_the_file_on_first_write() {
let dir = tempfile::tempdir().expect("tempdir");
let path = dir.path().join("evidence.txt");
assert!(!path.exists());
write_evidence_marker(Some(&path), "first line");
let contents = fs::read_to_string(&path).expect("read evidence file");
assert_eq!(contents, "first line\n");
}
#[test]
fn repeated_calls_append_in_order() {
let dir = tempfile::tempdir().expect("tempdir");
let path = dir.path().join("evidence.txt");
write_evidence_marker(Some(&path), "executed");
write_evidence_marker(Some(&path), "model-open: ok");
write_evidence_marker(Some(&path), "reporter-clear: ok");
let contents = fs::read_to_string(&path).expect("read evidence file");
assert_eq!(contents, "executed\nmodel-open: ok\nreporter-clear: ok\n");
}
#[test]
fn an_existing_file_is_appended_to_not_truncated() {
let dir = tempfile::tempdir().expect("tempdir");
let path = dir.path().join("evidence.txt");
fs::write(&path, "pre-existing\n").expect("seed file");
write_evidence_marker(Some(&path), "appended");
let contents = fs::read_to_string(&path).expect("read evidence file");
assert_eq!(contents, "pre-existing\nappended\n");
}
}