discogs_api/client/
builder.rs1use 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}