Skip to main content

pve_api/builder/
mod.rs

1//! The builder module contains requisites to build the [`Pve`] struct.
2
3// SPDX-License-Identifier: MIT
4// Copyright (c) 2026 Luke Harding <luke@lukeh990.io>
5
6mod 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/// Constructs a [`Pve`] struct.
17///
18/// The api_token and base_url are required or a [`BuildError`] will be made.
19#[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    /// Constructs [`PveBuilder`] with defaults (All defaults)
29    pub fn new() -> Self {
30        Default::default()
31    }
32
33    /// Run this at the end of the chain to build a [`Pve`].
34    ///
35    /// Minimum required set values: [`Self::api_token`], [`Self::base_url`]
36    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}