use crate::cypher::record::NamedRecord;
use std::io::Write;
use std::sync::Mutex;
use std::sync::OnceLock;
static SINK: OnceLock<Option<Mutex<std::fs::File>>> = OnceLock::new();
fn sink() -> Option<&'static Mutex<std::fs::File>> {
SINK.get_or_init(|| {
let path = std::env::var_os("GRAPHDBLITE_HEADERS_LOG")?;
let f = std::fs::OpenOptions::new()
.create(true)
.write(true)
.truncate(true)
.open(&path)
.unwrap_or_else(|e| panic!("GRAPHDBLITE_HEADERS_LOG={path:?}: open failed: {e}"));
Some(Mutex::new(f))
})
.as_ref()
}
pub fn log_headers(feature: &str, scenario: &str, records: &[NamedRecord]) {
let Some(mu) = sink() else { return };
let line = if records.is_empty() {
format!("{feature}::{scenario}\t<EMPTY>\n")
} else {
let cols: Vec<&str> = records[0].fields.keys().map(String::as_str).collect();
format!("{feature}::{scenario}\t{}\n", cols.join("|"))
};
let mut f = mu.lock().expect("headers sink mutex poisoned");
f.write_all(line.as_bytes())
.expect("write to GRAPHDBLITE_HEADERS_LOG failed");
}