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