1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
use crate::platform::Platform;
use std::path::PathBuf;
use std::fs::{OpenOptions, create_dir_all};
use std::io::prelude::*;
const INSTALL_FOLDER_NAME: &str = ".rapture";
pub fn path_to_string(p: PathBuf) -> String {
match p.into_os_string().into_string() {
Ok(s) => s,
Err(_) => "".to_string()
}
}
pub struct PathManager {}
impl PathManager {
pub fn home_dir() -> String {
match dirs::home_dir() {
Some(dir) => path_to_string(dir),
None => "/".to_string()
}
}
pub fn install_dir() -> String {
let home = Self::home_dir();
let mut install_dir = PathBuf::new();
install_dir.push(home);
install_dir.push(INSTALL_FOLDER_NAME);
return path_to_string(install_dir);
}
pub fn make_install_dir() -> Result<(), String> {
let install_dir = Self::install_dir();
match create_dir_all(install_dir) {
Ok(_) => Ok(()),
Err(_) => Ok(())
}
}
pub fn package_dir(name: String) -> String {
let install_dir = Self::install_dir();
let mut package_dir = PathBuf::new();
package_dir.push(install_dir);
package_dir.push(name);
return path_to_string(package_dir);
}
pub fn make_package_dir(name: String) -> Result<(), String> {
let package_dir = Self::package_dir(name);
match create_dir_all(package_dir) {
Ok(_) => Ok(()),
Err(_) => Ok(())
}
}
pub fn add_to_path(name: String) -> Result<(), String> {
let home = Self::home_dir();
match Platform::get() {
Platform::Unknown | Platform::MacOS | Platform::Ubuntu => {
let mut bashrc = PathBuf::new();
bashrc.push(home);
bashrc.push(".bashrc");
let mut file = OpenOptions::new()
.read(true)
.append(true)
.open(bashrc.clone());
match &mut file {
Ok(f) => {
let package_dir = Self::package_dir(name);
let path_addition = format!("export PATH=\"$PATH:{}\"", package_dir);
let mut contents = String::new();
f.read_to_string(&mut contents).unwrap();
for line in contents.lines() {
if line.to_string().contains(&path_addition) {
return Ok(());
}
}
match writeln!(f, "{}", path_addition) {
Ok(_) => Ok(()),
Err(_) => Err(format!("Failed to append to file {}", path_to_string(bashrc)))
}
},
Err(_) => Err(format!("Failed to add {} to PATH", name))
}
},
Platform::Windows => {
let package_dir = Self::package_dir(name);
let path_addition = format!("set PATH=%PATH%;{}", package_dir.clone());
println!("WARNING: modifying the path on windows is experimental. If this install does not seem to work, add '{}' to your path environment variable.", package_dir);
Platform::command(format!("{}", path_addition))
},
}
}
}