1use std::path::{Path, PathBuf};
2
3use serde::Serialize;
4
5fn ensure_parent_dir(path: &Path) {
6 if let Some(parent) = path.parent() {
7 std::fs::create_dir_all(parent).expect("mkdir");
8 }
9}
10
11pub fn write_text(path: &Path, contents: &str) -> PathBuf {
12 ensure_parent_dir(path);
13 std::fs::write(path, contents).expect("write text");
14 path.to_path_buf()
15}
16
17pub fn write_bytes(path: &Path, contents: &[u8]) -> PathBuf {
18 ensure_parent_dir(path);
19 std::fs::write(path, contents).expect("write bytes");
20 path.to_path_buf()
21}
22
23pub fn write_json<T: Serialize>(path: &Path, value: &T) -> PathBuf {
24 ensure_parent_dir(path);
25 let data = serde_json::to_vec_pretty(value).expect("json");
26 std::fs::write(path, data).expect("write json");
27 path.to_path_buf()
28}
29
30pub fn write_executable(path: &Path, contents: &str) -> PathBuf {
31 ensure_parent_dir(path);
32 std::fs::write(path, contents).expect("write executable");
33
34 #[cfg(unix)]
35 {
36 use std::os::unix::fs::PermissionsExt;
37 let mut perms = std::fs::metadata(path).expect("metadata").permissions();
38 perms.set_mode(0o755);
39 std::fs::set_permissions(path, perms).expect("set perms");
40 }
41
42 path.to_path_buf()
43}