xdg_basedir/
lib.rs

1#![cfg_attr(feature = "unstable", feature(libc, convert))]
2
3//! xdg-basedir is a utility library to make conforming to the
4//! [XDG basedir specification](http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html) easier.
5//!
6//! #Example
7//! ```ignore
8//! #![cfg(unix)]
9//! extern crate xdg_basedir;
10//!
11//! #![cfg(unix)]
12//! use xdg_basedir::*;
13//! use std::path::PathBuf;
14//! ...
15//! let data_home: PathBuf = try!(get_data_home());
16//! ...
17//! ```
18//!
19//! Alternate implementation and some initial source borrowed from [rust-xdg](https://github.com/o11c/rust-xdg).
20//! The APIs provided by ```rust-xdg``` and ```xdg-basedir``` are different.
21
22#[cfg(feature = "unstable")]
23extern crate libc;
24
25pub mod dirs;
26pub mod error;
27
28#[cfg(feature = "unstable")]
29pub mod unstable;
30
31mod env_path;
32
33pub use dirs::*;
34pub use error::*;
35
36#[cfg(feature = "unstable")]
37pub use unstable::*;
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42
43    use std::collections::HashMap;
44    use std::env::{self, home_dir, join_paths, split_paths};
45    use std::ffi::OsString;
46    use std::path::PathBuf;
47
48    #[test]
49    fn test_env_with_no_xdg_vars() {
50        let mut custom_env = HashMap::new();
51        custom_env.insert("dummy", "");
52
53        let f = &|var: &str| { custom_env.get(var).map(OsString::from) };
54
55        assert!(get_data_home_from_env(f).unwrap()   == home_dir().unwrap().join(".local/share"));
56        assert!(get_data_dirs_from_env(f)            == vec![PathBuf::from("/usr/local/share"), PathBuf::from("/usr/share")]);
57        assert!(get_config_home_from_env(f).unwrap() == home_dir().unwrap().join(".config"));
58        assert!(get_config_dirs_from_env(f)          == vec![PathBuf::from("/etc/xdg")]);
59        assert!(get_cache_home_from_env(f).unwrap()  == home_dir().unwrap().join(".cache"));
60        assert!(get_runtime_dir_from_env(f)          == None);
61    }
62
63    #[test]
64    fn test_env_with_empty_xdg_vars() {
65        let mut custom_env = HashMap::new();
66        custom_env.insert("XDG_DATA_HOME", "");
67        custom_env.insert("XDG_DATA_DIRS", "");
68        custom_env.insert("XDG_CONFIG_HOME", "");
69        custom_env.insert("XDG_CONFIG_DIRS", "");
70        custom_env.insert("XDG_CACHE_HOME", "");
71
72        let f = &|var: &str| { custom_env.get(var).map(OsString::from) };
73
74        assert!(get_data_home_from_env(f).unwrap()   == home_dir().unwrap().join(".local/share"));
75        assert!(get_data_dirs_from_env(f)            == vec![PathBuf::from("/usr/local/share"), PathBuf::from("/usr/share")]);
76        assert!(get_config_home_from_env(f).unwrap() == home_dir().unwrap().join(".config"));
77        assert!(get_config_dirs_from_env(f)          == vec![PathBuf::from("/etc/xdg")]);
78        assert!(get_cache_home_from_env(f).unwrap()  == home_dir().unwrap().join(".cache"));
79        assert!(get_runtime_dir_from_env(f)          == None);
80    }
81
82    #[test]
83    fn test_env_with_xdg_vars() {
84        let cwd = PathBuf::from(&env::current_dir().unwrap());
85        let mut custom_env = HashMap::new();
86
87        custom_env.insert("XDG_DATA_HOME", cwd.join("user/data").into_os_string());
88        custom_env.insert("XDG_DATA_DIRS", join_paths(vec![cwd.join("share/data"), cwd.join("local/data")]).unwrap());
89        custom_env.insert("XDG_CONFIG_HOME", cwd.join("user/config").into_os_string());
90        custom_env.insert("XDG_CONFIG_DIRS", join_paths(vec![cwd.join("config"), cwd.join("local/config")]).unwrap());
91        custom_env.insert("XDG_CACHE_HOME", cwd.join("user/cache").into_os_string());
92
93        let f = &|var: &str| { custom_env.get(var).map(OsString::from) };
94
95        assert!(get_data_home_from_env(f).unwrap()   == custom_env.get("XDG_DATA_HOME").map(PathBuf::from).unwrap());
96        assert!(get_data_dirs_from_env(f)            == split_paths(&custom_env["XDG_DATA_DIRS"]).collect::<Vec<PathBuf>>());
97        assert!(get_config_home_from_env(f).unwrap() == custom_env.get("XDG_CONFIG_HOME").map(PathBuf::from).unwrap());
98        assert!(get_config_dirs_from_env(f)          == split_paths(&custom_env["XDG_CONFIG_DIRS"]).collect::<Vec<PathBuf>>());
99        assert!(get_cache_home_from_env(f).unwrap()  == custom_env.get("XDG_CACHE_HOME").map(PathBuf::from).unwrap());
100    }
101}