summaryrefslogtreecommitdiffstats
path: root/src/common/setup.rs
blob: 2eceba18494e89c874bb7083dab433f17f81748d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
use crate::common::utils::consts::{SYSTEM_DEFAULT_CONFIG_DIR, VERSION};
use crate::os_input_output::set_permissions;
use directories_next::{BaseDirs, ProjectDirs};
use std::io::Write;
use std::{fs, path::Path, path::PathBuf};

const CONFIG_LOCATION: &str = "/.config/zellij";

#[macro_export]
macro_rules! asset_map {
    ($($src:literal => $dst:literal),+ $(,)?) => {
        {
            let mut assets = std::collections::HashMap::new();
            $(
                assets.insert($dst, include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/", $src)).to_vec());
            )+
            assets
        }
    }
}

pub mod install {
    use super::*;

    pub fn populate_data_dir(data_dir: &Path) {
        // First run installation of default plugins & layouts
        let mut assets = asset_map! {
            "assets/layouts/default.yaml" => "layouts/default.yaml",
            "assets/layouts/strider.yaml" => "layouts/strider.yaml",
        };
        assets.extend(asset_map! {
            "assets/plugins/status-bar.wasm" => "plugins/status-bar.wasm",
            "assets/plugins/tab-bar.wasm" => "plugins/tab-bar.wasm",
            "assets/plugins/strider.wasm" => "plugins/strider.wasm",
        });
        assets.insert("VERSION", VERSION.as_bytes().to_vec());

        let last_version = fs::read_to_string(data_dir.join("VERSION")).unwrap_or_default();
        let out_of_date = VERSION != last_version;

        for (path, bytes) in assets {
            let path = data_dir.join(path);
            let parent_path = path.parent().unwrap();
            fs::create_dir_all(parent_path).unwrap();
            set_permissions(parent_path).unwrap();
            if out_of_date || !path.exists() {
                fs::write(path, bytes).expect("Failed to install default assets!");
            }
        }
    }
}

#[cfg(not(test))]
pub fn find_default_config_dir() -> Option<PathBuf> {
    vec![
        Some(xdg_config_dir()),
        home_config_dir(),
        Some(Path::new(SYSTEM_DEFAULT_CONFIG_DIR).to_path_buf()),
    ]
    .into_iter()
    .filter(|p| p.is_some())
    .find(|p| p.clone().unwrap().exists())
    .flatten()
}

#[cfg(test)]
pub fn find_default_config_dir() -> Option<PathBuf> {
    None
}

pub fn xdg_config_dir() -> PathBuf {
    let project_dirs = ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap();
    project_dirs.config_dir().to_owned()
}

pub fn home_config_dir() -> Option<PathBuf> {
    if let Some(user_dirs) = BaseDirs::new() {
        let config_dir = user_dirs.home_dir().join(CONFIG_LOCATION);
        Some(config_dir)
    } else {
        None
    }
}

pub fn dump_asset(asset: &[u8]) -> std::io::Result<()> {
    std::io::stdout().write_all(&asset)?;
    Ok(())
}

pub const DEFAULT_CONFIG: &[u8] = include_bytes!(concat!(
    env!("CARGO_MANIFEST_DIR"),
    "/",
    "assets/config/default.yaml"
));

pub fn dump_default_config() -> std::io::Result<()> {
    dump_asset(DEFAULT_CONFIG)
}