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}