1#[cfg(feature = "xdg")]
2mod xdg_with_lib {
3 macro_rules! impl_xdg_dir_fn {
4 ($fn_name:ident, $dir_type:ident) => {
5 #[doc = concat!("Will create ", stringify!($fn_name), "_home/<crate_name>/$subpath/ (\"\" for no subpath; subpath is a **DIR**)")]
6 #[macro_export]
7 macro_rules! $fn_name {
8 ($subpath: expr) => {{
9 let dirs = xdg::BaseDirectories::with_prefix(env!("CARGO_PKG_NAME"));
10 dirs.$dir_type($subpath).unwrap()
11 }};
12 () => {
13 $fn_name!("")
14 };
15 }
16 };
17 }
18
19 macro_rules! impl_xdg_file_fn {
20 ($fn_name:ident, $dir_type:ident) => {
21 #[doc = concat!("Will create ", stringify!($fn_name), "_home/<crate_name>/ and return the path to the file specified in $subpath")]
22 #[macro_export]
23 macro_rules! $fn_name {
24 ($subpath: expr) => {{
25 let dirs = xdg::BaseDirectories::with_prefix(env!("CARGO_PKG_NAME"));
26 let path = std::path::PathBuf::from($subpath);
27 let parent = path.parent().unwrap_or(std::path::Path::new(""));
28 let base_dir = dirs.$dir_type(parent).unwrap();
29 base_dir.join(path.file_name().unwrap())
30 }};
31 }
32 };
33 }
34
35 impl_xdg_dir_fn!(xdg_data_dir, create_data_directory);
36 impl_xdg_file_fn!(xdg_data_file, create_data_directory);
37 impl_xdg_dir_fn!(xdg_config_dir, create_config_directory);
38 impl_xdg_file_fn!(xdg_config_file, create_config_directory);
39 impl_xdg_dir_fn!(xdg_cache_dir, create_cache_directory);
40 impl_xdg_file_fn!(xdg_cache_file, create_cache_directory);
41 impl_xdg_dir_fn!(xdg_state_dir, create_state_directory);
42 impl_xdg_file_fn!(xdg_state_file, create_state_directory);
43 impl_xdg_dir_fn!(xdg_runtime_dir, create_runtime_directory);
44 impl_xdg_file_fn!(xdg_runtime_file, create_runtime_directory);
45}
46
47#[cfg(not(feature = "xdg"))]
48mod xdg_no_deps {
49 macro_rules! impl_backup_xdg_dir_fn {
50 ($method_name:ident, $env_var:expr, $fallback_dir:expr) => {
51 #[doc = concat!("Will create $", stringify!($env_var), "/<crate_name>/$subpath/ (\"\" for no subpath; subpath is a **DIR**)")]
52 #[macro_export]
53 macro_rules! $method_name {
54 ($subpath: expr) => {{
55 let base_path = std::env::var($env_var).unwrap_or_else(|_| format!("{}/{}", std::env::var("HOME").unwrap(), $fallback_dir));
56 let mut dir = std::path::PathBuf::from(base_path).join(env!("CARGO_PKG_NAME"));
57 if !$subpath.is_empty() {
58 dir = dir.join($subpath);
59 }
60 std::fs::create_dir_all(&dir).unwrap();
61 dir
62 }};
63 }
64 };
65 }
66
67 macro_rules! impl_backup_xdg_file_fn {
68 ($method_name:ident, $env_var:expr, $fallback_dir:expr) => {
69 #[doc = concat!("Will create $", stringify!($env_var), "/<crate_name>/ and return the path to the file specified in $subpath")]
70 #[macro_export]
71 macro_rules! $method_name {
72 ($subpath: expr) => {{
73 let base_path = std::env::var($env_var).unwrap_or_else(|_| format!("{}/{}", std::env::var("HOME").unwrap(), $fallback_dir));
74 let base_dir = std::path::PathBuf::from(base_path).join(env!("CARGO_PKG_NAME"));
75 let path = std::path::PathBuf::from($subpath);
76 let parent = path.parent().unwrap_or(std::path::Path::new(""));
77 let dir = if parent.as_os_str().is_empty() { base_dir.clone() } else { base_dir.join(parent) };
78 std::fs::create_dir_all(&dir).unwrap();
79 base_dir.join(&path)
80 }};
81 }
82 };
83 }
84
85 impl_backup_xdg_dir_fn!(xdg_data_dir, "XDG_DATA_HOME", ".local/share");
86 impl_backup_xdg_file_fn!(xdg_data_file, "XDG_DATA_HOME", ".local/share");
87 impl_backup_xdg_dir_fn!(xdg_config_dir, "XDG_CONFIG_HOME", ".config");
88 impl_backup_xdg_file_fn!(xdg_config_file, "XDG_CONFIG_HOME", ".config");
89 impl_backup_xdg_dir_fn!(xdg_cache_dir, "XDG_CACHE_HOME", ".cache");
90 impl_backup_xdg_file_fn!(xdg_cache_file, "XDG_CACHE_HOME", ".cache");
91 impl_backup_xdg_dir_fn!(xdg_state_dir, "XDG_STATE_HOME", ".local/state");
92 impl_backup_xdg_file_fn!(xdg_state_file, "XDG_STATE_HOME", ".local/state");
93 impl_backup_xdg_dir_fn!(xdg_runtime_dir, "XDG_RUNTIME_DIR", ".runtime");
94 impl_backup_xdg_file_fn!(xdg_runtime_file, "XDG_RUNTIME_DIR", ".runtime");
95}