use allow_core::{CargoAllowError, CargoAllowResult};
use std::fs;
use std::path::Path;
pub(crate) fn emit_text(output: Option<&Path>, contents: &str) -> CargoAllowResult<()> {
if let Some(path) = output {
write_file(path, contents)?;
} else {
println!("{contents}");
}
Ok(())
}
pub(crate) fn emit_stderr_text(output: Option<&Path>, contents: &str) -> CargoAllowResult<()> {
if let Some(path) = output {
write_file(path, contents)?;
} else {
eprintln!("{contents}");
}
Ok(())
}
pub(crate) fn write_file(path: impl AsRef<Path>, contents: &str) -> CargoAllowResult<()> {
let path = path.as_ref();
if let Some(parent) = path.parent() {
fs::create_dir_all(parent).map_err(|e| {
CargoAllowError::new(format!("failed to create {}: {e}", parent.display()))
})?;
}
fs::write(path, contents)
.map_err(|e| CargoAllowError::new(format!("failed to write {}: {e}", path.display())))
}
pub(crate) fn write_file_no_overwrite(
path: impl AsRef<Path>,
contents: &str,
force: bool,
) -> CargoAllowResult<()> {
let path = path.as_ref();
if path.exists() && !force {
return Err(CargoAllowError::new(format!(
"{} already exists; use --force to overwrite",
path.display()
)));
}
write_file(path, contents)
}