1 use std::path::PathBuf;
2 use std::iter::FromIterator;
3 
4 use crate::BaseDirs;
5 use crate::UserDirs;
6 use crate::ProjectDirs;
7 
base_dirs() -> Option<BaseDirs>8 pub fn base_dirs() -> Option<BaseDirs> {
9     let home_dir       = dirs_sys_next::known_folder_profile();
10     let data_dir       = dirs_sys_next::known_folder_roaming_app_data();
11     let data_local_dir = dirs_sys_next::known_folder_local_app_data();
12     if let (Some(home_dir), Some(data_dir), Some(data_local_dir)) = (home_dir, data_dir, data_local_dir) {
13         let cache_dir  = data_local_dir.clone();
14         let config_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_next::known_folder_profile() {
33         let audio_dir     = dirs_sys_next::known_folder_music();
34         let desktop_dir   = dirs_sys_next::known_folder_desktop();
35         let document_dir  = dirs_sys_next::known_folder_documents();
36         let download_dir  = dirs_sys_next::known_folder_downloads();
37         let picture_dir   = dirs_sys_next::known_folder_pictures();
38         let public_dir    = dirs_sys_next::known_folder_public();
39         let template_dir  = dirs_sys_next::known_folder_templates();
40         let video_dir     = dirs_sys_next::known_folder_videos();
41 
42         let user_dirs = UserDirs {
43             home_dir:     home_dir,
44             audio_dir:    audio_dir,
45             desktop_dir:  desktop_dir,
46             document_dir: document_dir,
47             download_dir: download_dir,
48             font_dir:     None,
49             picture_dir:  picture_dir,
50             public_dir:   public_dir,
51             template_dir: template_dir,
52             video_dir:    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     let app_data_local   = dirs_sys_next::known_folder_local_app_data();
62     let app_data_roaming = dirs_sys_next::known_folder_roaming_app_data();
63     if let (Some(app_data_local), Some(app_data_roaming)) = (app_data_local, app_data_roaming) {
64         let app_data_local   = app_data_local.join(&project_path);
65         let app_data_roaming = app_data_roaming.join(&project_path);
66         let cache_dir        = app_data_local.join("cache");
67         let data_local_dir   = app_data_local.join("data");
68         let config_dir       = app_data_roaming.join("config");
69         let data_dir         = app_data_roaming.join("data");
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             runtime_dir:    None
78         };
79         Some(project_dirs)
80     } else {
81         None
82     }
83 
84 }
85 
project_dirs_from(_qualifier: &str, organization: &str, application: &str) -> Option<ProjectDirs>86 pub fn project_dirs_from(_qualifier: &str, organization: &str, application: &str) -> Option<ProjectDirs> {
87     ProjectDirs::from_path(PathBuf::from_iter(&[organization, application]))
88 }
89