use std::fs;
use std::io::{self, Write};
use std::path::Path;
pub(crate) fn write_atomic(path: &Path, contents: &[u8]) -> io::Result<()> {
let parent = path
.parent()
.ok_or_else(|| io::Error::other("no parent directory"))?;
create_private_dir(parent)?;
let mut temp = tempfile::NamedTempFile::new_in(parent)?;
temp.write_all(contents)?;
temp.as_file().sync_all()?;
temp.persist(path).map_err(|e| e.error)?;
Ok(())
}
pub(crate) fn create_private_dir(dir: &Path) -> io::Result<()> {
let mut builder = fs::DirBuilder::new();
builder.recursive(true);
#[cfg(unix)]
std::os::unix::fs::DirBuilderExt::mode(&mut builder, 0o700);
builder.create(dir)
}