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
use std::str::FromStr;
use reqwest::{self, blocking::Client, Url};
use super::{Jenkins, User};
use crate::client::Result;
#[derive(Debug)]
pub struct JenkinsBuilder {
url: String,
user: Option<User>,
csrf_enabled: bool,
depth: u8,
}
impl JenkinsBuilder {
pub fn new(url: &str) -> Self {
JenkinsBuilder {
url: {
let last: String = url.chars().rev().take(1).collect();
match last.as_str() {
"/" => url[0..(url.len() - 1)].to_string(),
_ => url.to_string(),
}
},
user: None,
csrf_enabled: true,
depth: 1,
}
}
pub fn build(self) -> Result<Jenkins> {
let url = Url::from_str(&self.url)?;
if url.cannot_be_a_base() {
return Err(url::ParseError::RelativeUrlWithoutBase.into());
};
if !url.has_host() {
return Err(url::ParseError::EmptyHost.into());
}
Ok(Jenkins {
url: self.url,
client: Client::builder().build()?,
user: self.user,
csrf_enabled: self.csrf_enabled,
depth: self.depth,
})
}
pub fn with_user(mut self, login: &str, password: Option<&str>) -> Self {
self.user = Some(User {
username: login.to_string(),
password: password.map(std::string::ToString::to_string),
});
self
}
pub fn disable_csrf(mut self) -> Self {
self.csrf_enabled = false;
self
}
pub fn with_depth(mut self, depth: u8) -> Self {
self.depth = depth;
self
}
}
#[cfg(test)]
mod tests {
static JENKINS_URL: &str = "http://none:8080";
#[test]
fn create_builder() {
let jenkins_client = crate::JenkinsBuilder::new(JENKINS_URL);
assert_eq!(jenkins_client.url, JENKINS_URL);
assert_eq!(jenkins_client.user, None);
assert_eq!(jenkins_client.csrf_enabled, true);
}
#[test]
fn create_builder_with_trailing_slash() {
let jenkins_client = crate::JenkinsBuilder::new(&format!("{}/", JENKINS_URL));
assert_eq!(jenkins_client.url, JENKINS_URL);
assert_eq!(jenkins_client.user, None);
assert_eq!(jenkins_client.csrf_enabled, true);
}
#[test]
fn disable_csrf() {
let jenkins_client = crate::JenkinsBuilder::new(JENKINS_URL).disable_csrf();
assert_eq!(jenkins_client.url, JENKINS_URL);
assert_eq!(jenkins_client.user, None);
assert_eq!(jenkins_client.csrf_enabled, false);
}
}