1use eyre::{Context, Result};
2use std::env::current_dir;
3use std::path::PathBuf;
4
5#[derive(Debug, Default, Clone)]
6pub struct Env {
7 root_dir: PathBuf,
8 task_dir: PathBuf,
9 output_dir: PathBuf,
10 resource_dir: PathBuf,
11}
12
13impl Env {
14 pub fn new(task_dir: PathBuf) -> Result<Self> {
15 let root_dir = current_dir().wrap_err("Unable to get current directory.")?;
16 let task_name = task_dir.file_name().unwrap().to_str().unwrap().to_owned();
17
18 let output_dir = root_dir.join("output").join(&task_name);
19 if !output_dir.is_dir() {
20 std::fs::create_dir_all(&output_dir)
21 .wrap_err_with(|| format!("Unable to create output directory: {output_dir:?}"))?;
22 }
23
24 let resource_dir = if task_dir.join("data").exists() {
25 task_dir.join("data")
26 } else {
27 task_dir.clone()
28 };
29
30 Ok(Self {
31 root_dir,
32 task_dir,
33 output_dir,
34 resource_dir,
35 })
36 }
37
38 #[inline(always)]
39 pub fn root(&self) -> &PathBuf {
40 &self.root_dir
41 }
42
43 #[inline(always)]
44 pub fn task(&self) -> &PathBuf {
45 &self.task_dir
46 }
47
48 #[inline(always)]
49 pub fn output(&self) -> &PathBuf {
50 &self.output_dir
51 }
52
53 #[inline(always)]
54 pub fn resource(&self) -> &PathBuf {
55 &self.resource_dir
56 }
57}