v_utils/io/
xdg.rs

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}