discogs_api/client/
builder.rs

1use super::{Auth, Client};
2use reqwest::Url;
3use thiserror::Error;
4
5#[derive(Debug, Error)]
6pub enum BuildError {
7    #[error("{0}")]
8    ReqwestError(#[from] reqwest::Error),
9    #[error("couldn't parse base url")]
10    UrlParseError,
11}
12
13#[derive(Default)]
14pub struct ClientBuilder {
15    auth: Option<Auth>,
16    client: Option<reqwest::blocking::Client>,
17    user_agent: Option<String>,
18    base_url: Option<Url>,
19}
20
21impl ClientBuilder {
22    #[must_use]
23    pub fn new() -> Self {
24        Self::default()
25    }
26
27    pub fn build(self) -> Result<Client, BuildError> {
28        let client = if let Some(client) = self.client {
29            client
30        } else {
31            reqwest::blocking::Client::builder()
32                .user_agent(self.user_agent.unwrap_or_else(|| String::from("Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.3")))
33                .build()?
34        };
35
36        let url_base = if let Some(url_base) = self.base_url {
37            url_base
38        } else if let Ok(url_base) = Url::parse("https://api.discogs.com") {
39            url_base
40        } else {
41            return Err(BuildError::UrlParseError);
42        };
43
44        Ok(Client {
45            client,
46            auth: self.auth,
47            url_base,
48        })
49    }
50
51    #[must_use]
52    pub fn auth(mut self, auth: Auth) -> Self {
53        self.auth = Some(auth);
54        self
55    }
56
57    #[must_use]
58    pub fn client(mut self, client: reqwest::blocking::Client) -> Self {
59        self.client = Some(client);
60        self
61    }
62
63    #[must_use]
64    pub fn user_agent(mut self, user_agent: String) -> Self {
65        self.user_agent = Some(user_agent);
66        self
67    }
68}