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