1use std::fs::File;
19use std::io::{BufRead, BufReader};
20use std::env::VarError;
22use crate::basedir;
23
24pub fn filename() -> Result<String, VarError> {
26 let conf_dir = match basedir::config_home() {
27 Ok(c) => c,
28 Err(e) => return Err(e),
29 };
30 Ok(format!("{}/user-dirs.dirs", conf_dir.as_str()))
31}
32
33#[derive(Clone, Debug)]
36pub struct UserDirs {
37 pub desktop:String,
39 pub download:String,
41 pub template:String,
43 pub public_share:String,
45 pub documents:String,
47 pub music:String,
49 pub pictures:String,
51 pub videos:String,
53}
54impl UserDirs {
55 #[allow(dead_code)]
57 pub fn empty() -> Self {
58 Self {
59 desktop:String::new(),
60 download:String::new(),
61 template:String::new(),
62 public_share:String::new(),
63 documents:String::new(),
64 music:String::new(),
65 pictures:String::new(),
66 videos:String::new(),
67 }
68 }
69 #[allow(dead_code)]
71 pub fn new() -> Self {
72 let mut desktop = String::new();
73 let mut download = String::new();
74 let mut template = String::new();
75 let mut public_share = String::new();
76 let mut documents = String::new();
77 let mut music = String::new();
78 let mut pictures = String::new();
79 let mut videos = String::new();
80 let file_name = match filename() {
81 Ok(f) => f,
82 Err(_) => return Self::empty(),
83 };
84 let home = match basedir::home() {
86 Ok(h) => h,
87 Err(_) => "$HOME".to_string(),
88 };
89 let file = match File::open(file_name.as_str()) {
91 Ok(f) => f,
92 Err(_) => return Self::empty(),
93 };
94 let file_reader = BufReader::new(file);
95 for (_line_number, line) in file_reader.lines().enumerate() {
96 if line.is_err() {
97 continue;
98 }
99 let mut line = line.unwrap();
100 if let Some(position) = line.find('#') {
102 if position == 0 {
103 continue;
104 }
105 }
106 line.retain(|c| c != '"');if let Some((var, dir)) = line.rsplit_once('=') {
108 let _stizzle = dir.replace("$HOME", home.as_str());
109 if var == "XDG_DESKTOP_DIR" {
110 desktop = dir.to_string();
111 } else if var == "XDG_DOWNLOAD_DIR" {
112 download = dir.to_string();
113 } else if var == "XDG_TEMPLATES_DIR" {
114 template = dir.to_string();
115 } else if var == "XDG_PUBLICSHARE_DIR" {
116 public_share = dir.to_string();
117 } else if var == "XDG_DOCUMENTS_DIR" {
118 documents = dir.to_string();
119 } else if var == "XDG_MUSIC_DIR" {
120 music = dir.to_string();
121 } else if var == "XDG_PICTURES_DIR" {
122 pictures = dir.to_string();
123 } else if var == "XDG_VIDEOS_DIR" {
124 videos = dir.to_string();
125 }
126 }
127 }
128 Self {
129 desktop,
130 download,
131 template,
132 public_share,
133 documents,
134 music,
135 pictures,
136 videos,
137 }
138 }
139}