1mod api_token;
7mod base_url;
8mod error;
9mod user_agent;
10mod weak_tls;
11
12use crate::Pve;
13pub use error::BuildError;
14use reqwest::{Client, Url, header};
15
16#[derive(Default, Debug)]
20pub struct PveBuilder {
21 user_agent: Option<String>,
22 api_token: Option<(String, String)>,
23 base_url: Option<String>,
24 weak_tls: Option<bool>,
25}
26
27impl PveBuilder {
28 pub fn new() -> Self {
30 Default::default()
31 }
32
33 pub fn build(self) -> Result<Pve, BuildError> {
37 let user_agent_def = format!("{}/{}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"));
38 let user_agent = self.user_agent.unwrap_or(user_agent_def);
39
40 let mut header_map = header::HeaderMap::new();
41
42 let api_token = self.api_token.ok_or(BuildError::NoToken)?;
43 let mut api_token_header =
44 header::HeaderValue::from_str(&format!("PVEAPIToken={}={}", api_token.0, api_token.1))?;
45 api_token_header.set_sensitive(true);
46 header_map.insert(header::AUTHORIZATION, api_token_header);
47
48 let weak_tls = self.weak_tls.unwrap_or(false);
49
50 let client_builder = Client::builder()
51 .user_agent(user_agent)
52 .default_headers(header_map)
53 .tls_danger_accept_invalid_certs(weak_tls);
54
55 let client = client_builder.build().map_err(BuildError::ReqwestBuild)?;
56
57 let base_url_str = self.base_url.ok_or(BuildError::NoBase)?;
58 let mut base_url = Url::parse(&base_url_str)?;
59
60 base_url.set_path("/api2/json/");
61
62 Ok(Pve::new(client, base_url))
63 }
64}