use std::io::Write;
pub fn scratch(dir: &tempfile::TempDir, name: &str, content: &str) -> String {
let path = dir.path().join(name);
std::fs::write(&path, content).expect("write scratch file");
path.to_string_lossy().into_owned()
}
pub fn scratch_gz(dir: &tempfile::TempDir, name: &str, content: &str) -> String {
let path = dir.path().join(name);
write_gz_members(&path, content, 1, false);
path.to_string_lossy().into_owned()
}
pub fn write_gz_members(path: &std::path::Path, text: &str, members: usize, bgzf_extra: bool) {
assert!(members > 0);
let payloads: Vec<String> = if members == 1 {
vec![text.to_string()]
} else {
let lines: Vec<&str> = text.lines().collect();
let per = lines.len().div_ceil(members).max(1);
lines
.chunks(per)
.map(|chunk| {
let mut payload = chunk.join("\n");
payload.push('\n');
payload
})
.collect()
};
let mut bytes: Vec<u8> = Vec::new();
for payload in payloads {
let mut builder = flate2::GzBuilder::new();
if bgzf_extra {
builder = builder.extra(vec![b'B', b'C', 2, 0, 0, 0]);
}
let mut enc = builder.write(Vec::new(), flate2::Compression::default());
enc.write_all(payload.as_bytes()).expect("write gz member");
bytes.extend(enc.finish().expect("finish gz member"));
}
std::fs::write(path, bytes).expect("write gz file");
}