picsum_rs/
lib.rs

1pub mod api;
2
3use std::sync::Arc;
4
5static BASE_URL: &str = "https://picsum.photos";
6
7#[derive(Debug, Clone, Default)]
8pub struct PicsumClient {
9    inner: Arc<PicsumClientInner>,
10}
11
12#[derive(Debug, Clone)]
13struct PicsumClientInner {
14    client: reqwest::Client,
15    base_url: String,
16}
17
18impl Default for PicsumClientInner {
19    fn default() -> Self {
20        Self {
21            client: reqwest::Client::default(),
22            base_url: BASE_URL.to_string(),
23        }
24    }
25}
26
27impl PicsumClient {
28    pub fn builder() -> PicsumClientBuilder {
29        PicsumClientBuilder::new()
30    }
31}
32
33#[derive(Debug, Clone)]
34pub struct PicsumClientBuilder {
35    client: Option<reqwest::Client>,
36    base_url: String,
37}
38
39impl Default for PicsumClientBuilder {
40    fn default() -> Self {
41        Self {
42            client: Some(reqwest::Client::default()),
43            base_url: BASE_URL.to_string(),
44        }
45    }
46}
47
48impl PicsumClientBuilder {
49    pub fn new() -> Self {
50        Self {
51            client: None,
52            base_url: BASE_URL.to_string(),
53        }
54    }
55
56    pub fn client(mut self, client: reqwest::Client) -> Self {
57        self.client = Some(client);
58        self
59    }
60
61    pub fn base_url(mut self, base_url: String) -> Self {
62        self.base_url = base_url;
63        self
64    }
65
66    pub fn build(&self) -> PicsumClient {
67        let inner = PicsumClientInner {
68            client: self.client.clone().unwrap_or_default(),
69            base_url: self.base_url.clone(),
70        };
71
72        PicsumClient {
73            inner: Arc::new(inner),
74        }
75    }
76}