pexels_sdk/photos/
curated.rs

1use crate::{Pexels, PexelsError, PhotosResponse, PEXELS_API, PEXELS_VERSION};
2use url::Url;
3
4/// Pexels API path for curated photos
5const PEXELS_CURATED_PATH: &str = "curated";
6
7/// This endpoint enables you to receive real-time photos curated by the Pexels team.
8pub struct Curated {
9    page: Option<usize>,
10    per_page: Option<usize>,
11}
12
13impl Curated {
14    /// Creates [`CuratedBuilder`] for building URI's.
15    pub fn builder() -> CuratedBuilder {
16        CuratedBuilder::default()
17    }
18
19    /// Create URI from inputted vales from the [`CuratedBuilder`].
20    pub fn create_uri(&self) -> crate::BuilderResult {
21        let uri = format!("{PEXELS_API}/{PEXELS_VERSION}/{PEXELS_CURATED_PATH}");
22
23        let mut url = Url::parse(uri.as_str())?;
24
25        if let Some(page) = &self.page {
26            url.query_pairs_mut()
27                .append_pair("page", page.to_string().as_str());
28        }
29
30        if let Some(per_page) = &self.per_page {
31            url.query_pairs_mut()
32                .append_pair("per_page", per_page.to_string().as_str());
33        }
34
35        Ok(url.into())
36    }
37
38    /// Fetches the photo data from the Pexels API `Curated` endpoint.
39    pub async fn fetch(&self, client: &Pexels) -> Result<PhotosResponse, PexelsError> {
40        let url = self.create_uri()?;
41        let response = client.make_request(url.as_str()).await?;
42        let photos_response: PhotosResponse = serde_json::from_value(response)?;
43        Ok(photos_response)
44    }
45}
46
47/// Builder for [`Curated`].
48#[derive(Default)]
49pub struct CuratedBuilder {
50    page: Option<usize>,
51    per_page: Option<usize>,
52}
53
54impl CuratedBuilder {
55    /// Creates a new [`CuratedBuilder`].
56    pub fn new() -> Self {
57        Self {
58            page: None,
59            per_page: None,
60        }
61    }
62
63    /// Sets the page number for the request.
64    pub fn page(mut self, page: usize) -> Self {
65        self.page = Some(page);
66        self
67    }
68
69    /// Sets the number of results per page for the request.
70    pub fn per_page(mut self, per_page: usize) -> Self {
71        self.per_page = Some(per_page);
72        self
73    }
74
75    /// Create [`Curated`] from the [`CuratedBuilder`]
76    pub fn build(self) -> Curated {
77        Curated {
78            page: self.page,
79            per_page: self.per_page,
80        }
81    }
82}
83
84#[cfg(test)]
85mod tests {
86    use super::*;
87
88    #[test]
89    fn test_page() {
90        let uri = CuratedBuilder::new().page(1).build();
91        assert_eq!(
92            "https://api.pexels.com/v1/curated?page=1",
93            uri.create_uri().unwrap()
94        );
95    }
96
97    #[test]
98    fn test_per_page() {
99        let uri = CuratedBuilder::new().per_page(1).build();
100        assert_eq!(
101            "https://api.pexels.com/v1/curated?per_page=1",
102            uri.create_uri().unwrap()
103        );
104    }
105}