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}