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