1 extern crate dirs_sys;
2 
3 use std::path::PathBuf;
4 
5 use BaseDirs;
6 use UserDirs;
7 use ProjectDirs;
8 
base_dirs() -> Option<BaseDirs>9 pub fn base_dirs() -> Option<BaseDirs> {
10     if let Some(home_dir)  = dirs_sys::home_dir() {
11         let cache_dir      = home_dir.join("Library/Caches");
12         let config_dir     = home_dir.join("Library/Application Support");
13         let data_dir       = home_dir.join("Library/Application Support");
14         let data_local_dir = data_dir.clone();
15         let preference_dir = home_dir.join("Library/Preferences");
16 
17         let base_dirs = BaseDirs {
18             home_dir:       home_dir,
19             cache_dir:      cache_dir,
20             config_dir:     config_dir,
21             data_dir:       data_dir,
22             data_local_dir: data_local_dir,
23             executable_dir: None,
24             preference_dir: preference_dir,
25             runtime_dir:    None,
26             state_dir:      None
27         };
28         Some(base_dirs)
29     } else {
30         None
31     }
32 }
33 
user_dirs() -> Option<UserDirs>34 pub fn user_dirs() -> Option<UserDirs> {
35     if let Some(home_dir) = dirs_sys::home_dir() {
36         let audio_dir     = home_dir.join("Music");
37         let desktop_dir   = home_dir.join("Desktop");
38         let document_dir  = home_dir.join("Documents");
39         let download_dir  = home_dir.join("Downloads");
40         let picture_dir   = home_dir.join("Pictures");
41         let public_dir    = home_dir.join("Public");
42         let video_dir     = home_dir.join("Movies");
43         let font_dir      = home_dir.join("Library/Fonts");
44 
45         let user_dirs = UserDirs {
46             home_dir:     home_dir,
47             audio_dir:    Some(audio_dir),
48             desktop_dir:  Some(desktop_dir),
49             document_dir: Some(document_dir),
50             download_dir: Some(download_dir),
51             font_dir:     Some(font_dir),
52             picture_dir:  Some(picture_dir),
53             public_dir:   Some(public_dir),
54             template_dir: None,
55             video_dir:    Some(video_dir)
56         };
57         Some(user_dirs)
58     } else {
59         None
60     }
61 }
62 
project_dirs_from_path(project_path: PathBuf) -> Option<ProjectDirs>63 pub fn project_dirs_from_path(project_path: PathBuf) -> Option<ProjectDirs> {
64     if let Some(home_dir)  = dirs_sys::home_dir() {
65         let cache_dir      = home_dir.join("Library/Caches").join(&project_path);
66         let config_dir     = home_dir.join("Library/Application Support").join(&project_path);
67         let data_dir       = home_dir.join("Library/Application Support").join(&project_path);
68         let data_local_dir = data_dir.clone();
69         let preference_dir = home_dir.join("Library/Preferences").join(&project_path);
70 
71         let project_dirs = ProjectDirs {
72             project_path:   project_path,
73             cache_dir:      cache_dir,
74             config_dir:     config_dir,
75             data_dir:       data_dir,
76             data_local_dir: data_local_dir,
77             preference_dir: preference_dir,
78             runtime_dir:    None,
79             state_dir:      None
80         };
81         Some(project_dirs)
82     } else {
83         None
84     }
85 }
86 
project_dirs_from(qualifier: &str, organization: &str, application: &str) -> Option<ProjectDirs>87 pub fn project_dirs_from(qualifier: &str, organization: &str, application: &str) -> Option<ProjectDirs> {
88     // we should replace more characters, according to RFC1034 identifier rules
89     let organization = organization.replace(" ", "-");
90     let application  = application.replace(" ", "-");
91     let mut parts    = vec![qualifier, &organization, &application]; parts.retain(|e| !e.is_empty());
92     let bundle_id    = parts.join(".");
93     ProjectDirs::from_path(PathBuf::from(bundle_id))
94 }
95