shell_scene/util/
fsx.rs

1use crate::util::eprintln_err;
2use chrono::Local;
3use std::fs::{self, File};
4use std::path::{Path, PathBuf};
5
6pub fn now_yyyymmdd_hhmmss() -> String {
7    Local::now().format("%Y%m%d-%H%M%S").to_string()
8}
9
10pub fn home_dir() -> PathBuf {
11    std::env::var_os("HOME")
12        .map(PathBuf::from)
13        .unwrap_or_else(|| {
14            eprintln_err("Could not determine $HOME");
15            std::process::exit(1);
16        })
17}
18
19pub fn ensure_writable_dir(p: &Path) {
20    if let Err(e) = fs::create_dir_all(p) {
21        eprintln_err(&format!(
22            "Directory does not exist and could not be created: {} ({})",
23            p.display(),
24            e
25        ));
26        std::process::exit(1);
27    }
28    let probe = p.join(".writable_probe.tmp");
29    match File::create(&probe) {
30        Ok(_) => {
31            let _ = fs::remove_file(&probe);
32        }
33        Err(_) => {
34            eprintln_err(&format!("Directory is not writable: {}", p.display()));
35            std::process::exit(1);
36        }
37    }
38}
39
40pub fn validate_workdir(p: &Path) {
41    if !p.is_dir() {
42        eprintln_err(&format!(
43            "WORKING_DIRECTORY does not exist: {}",
44            p.display()
45        ));
46        std::process::exit(1);
47    }
48    if std::fs::read_dir(p).is_err() {
49        eprintln_err(&format!(
50            "WORKING_DIRECTORY is not readable: {}",
51            p.display()
52        ));
53        std::process::exit(1);
54    }
55}