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