1 extern crate dirs_sys;
2
3 use std::path::PathBuf;
4 use std::iter::FromIterator;
5
6 use BaseDirs;
7 use UserDirs;
8 use ProjectDirs;
9
base_dirs() -> Option<BaseDirs>10 pub fn base_dirs() -> Option<BaseDirs> {
11 let home_dir = dirs_sys::known_folder_profile();
12 let data_dir = dirs_sys::known_folder_roaming_app_data();
13 let data_local_dir = dirs_sys::known_folder_local_app_data();
14 if let (Some(home_dir), Some(data_dir), Some(data_local_dir)) = (home_dir, data_dir, data_local_dir) {
15 let cache_dir = data_local_dir.clone();
16 let config_dir = data_dir.clone();
17
18 let base_dirs = BaseDirs {
19 home_dir: home_dir,
20 cache_dir: cache_dir,
21 config_dir: config_dir,
22 data_dir: data_dir,
23 data_local_dir: data_local_dir,
24 executable_dir: None,
25 runtime_dir: None
26 };
27 Some(base_dirs)
28 } else {
29 None
30 }
31 }
32
user_dirs() -> Option<UserDirs>33 pub fn user_dirs() -> Option<UserDirs> {
34 if let Some(home_dir) = dirs_sys::known_folder_profile() {
35 let audio_dir = dirs_sys::known_folder_music();
36 let desktop_dir = dirs_sys::known_folder_desktop();
37 let document_dir = dirs_sys::known_folder_documents();
38 let download_dir = dirs_sys::known_folder_downloads();
39 let picture_dir = dirs_sys::known_folder_pictures();
40 let public_dir = dirs_sys::known_folder_public();
41 let template_dir = dirs_sys::known_folder_templates();
42 let video_dir = dirs_sys::known_folder_videos();
43
44 let user_dirs = UserDirs {
45 home_dir: home_dir,
46 audio_dir: audio_dir,
47 desktop_dir: desktop_dir,
48 document_dir: document_dir,
49 download_dir: download_dir,
50 font_dir: None,
51 picture_dir: picture_dir,
52 public_dir: public_dir,
53 template_dir: template_dir,
54 video_dir: video_dir
55 };
56 Some(user_dirs)
57 } else {
58 None
59 }
60 }
61
project_dirs_from_path(project_path: PathBuf) -> Option<ProjectDirs>62 pub fn project_dirs_from_path(project_path: PathBuf) -> Option<ProjectDirs> {
63 let app_data_local = dirs_sys::known_folder_local_app_data();
64 let app_data_roaming = dirs_sys::known_folder_roaming_app_data();
65 if let (Some(app_data_local), Some(app_data_roaming)) = (app_data_local, app_data_roaming) {
66 let app_data_local = app_data_local.join(&project_path);
67 let app_data_roaming = app_data_roaming.join(&project_path);
68 let cache_dir = app_data_local.join("cache");
69 let data_local_dir = app_data_local.join("data");
70 let config_dir = app_data_roaming.join("config");
71 let data_dir = app_data_roaming.join("data");
72
73 let project_dirs = ProjectDirs {
74 project_path: project_path,
75 cache_dir: cache_dir,
76 config_dir: config_dir,
77 data_dir: data_dir,
78 data_local_dir: data_local_dir,
79 runtime_dir: None
80 };
81 Some(project_dirs)
82 } else {
83 None
84 }
85
86 }
87
project_dirs_from(_qualifier: &str, organization: &str, application: &str) -> Option<ProjectDirs>88 pub fn project_dirs_from(_qualifier: &str, organization: &str, application: &str) -> Option<ProjectDirs> {
89 ProjectDirs::from_path(PathBuf::from_iter(&[organization, application]))
90 }
91