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
use super::reqs::*;
use std::collections::HashMap;
pub struct FirefoxOptions{
pub(crate) string_for_session:String,
}
impl FirefoxOptions{
pub fn new()->Self{
FirefoxOptions{
string_for_session: String::from(r#""moz:firefoxOptions":{}"#),
}
}
pub fn add_binary(&mut self,path: &str)->&mut Self{
if self.string_for_session.contains("binary"){panic!("The options already contain path to binary");}
self.string_for_session.pop();
let bin = format!(r#""binary":"{}","#,path);
self.string_for_session.push_str(&bin);
self.string_for_session.push('}');
self
}
pub fn add_args(&mut self, args: Vec<&str>)->&mut Self{
if self.string_for_session.contains("args"){panic!("The options already contain args");}
self.string_for_session.pop();
let mut inner_args = String::from("\"args\":");
let vec_to_str = from_str_vec_to_str(args);
inner_args.push_str(&vec_to_str);
self.string_for_session.push_str(&inner_args);
self.string_for_session.push('}');
self
}
pub fn add_prefs(&mut self, prefs:&str)->&mut Self{
if self.string_for_session.contains("prefs"){panic!("The options already contain prefs");}
self.string_for_session.pop();
let text = format!(r#""prefs":{},"#,prefs);
self.string_for_session.push_str(&text);
self.string_for_session.push('}');
self
}
pub fn add_log(&mut self, log_level:LogLevel)->&mut Self{
if self.string_for_session.contains("log"){panic!("The options already contain log");}
self.string_for_session.pop();
let lev_to_str = match log_level{
LogLevel::Trace=>"trace",
LogLevel::Debug=>"debug",
LogLevel::Config=>"config",
LogLevel::Info=>"info",
LogLevel::Warn=>"warn",
LogLevel::Error=>"error",
LogLevel::Fatal=>"fatal"
};
let text = format!(r#""log":{{"level":"{}"}},"#,lev_to_str);
self.string_for_session.push_str(&text);
self.string_for_session.push('}');
self
}
pub fn add_env(&mut self,env_vars: HashMap<&str,&str>)->&mut Self{
if self.string_for_session.contains("env"){panic!("The options already contain env vars");}
self.string_for_session.pop();
let mut temp_string = String::from("\"env\":{");
for i in env_vars{
let temp = format!(r#""{}":"{}","#,i.0,i.1);
temp_string.push_str(&temp);
}
temp_string.pop();
temp_string.push('}');
temp_string.push(',');
self.string_for_session.push_str(&temp_string);
self.string_for_session.push('}');
self
}
}
pub enum LogLevel{
Trace,
Debug,
Config,
Info,
Warn,
Error,
Fatal
}
mod firefox_tests{
use super::*;
#[test]
fn firef_opts() {
let map = r#"{"one":2,"two":"two_val"}"#;
let mut ff = FirefoxOptions::new();
ff.add_binary("C\\Users\\Me");
ff.add_prefs(map);
ff.add_args(vec!["-headless","-devtools"]);
ff.add_log(LogLevel::Error);
let mut m = HashMap::new();
m.insert("first var","first var val");
ff.add_env(m);
let x = r#""moz:firefoxOptions":{"binary":"C\Users\Me","prefs":{"one":2,"two":"two_val"},"args":["-headless","-devtools"],"log":{"level":"error"},"env":{"first var":"first var val"},}"#;
assert_eq!(x,ff.string_for_session);
}
}