pexels_api/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().append_pair("page", page.to_string().as_str());
27        }
28
29        if let Some(per_page) = &self.per_page {
30            url.query_pairs_mut().append_pair("per_page", per_page.to_string().as_str());
31        }
32
33        Ok(url.into())
34    }
35
36    /// Fetches the photo data from the Pexels API `Curated` endpoint.
37    pub async fn fetch(&self, client: &Pexels) -> Result<PhotosResponse, PexelsError> {
38        let url = self.create_uri()?;
39        let response = client.make_request(url.as_str()).await?;
40        let photos_response: PhotosResponse = serde_json::from_value(response)?;
41        Ok(photos_response)
42    }
43}
44
45/// Builder for [`Curated`].
46#[derive(Default)]
47pub struct CuratedBuilder {
48    page: Option<usize>,
49    per_page: Option<usize>,
50}
51
52impl CuratedBuilder {
53    /// Creates a new [`CuratedBuilder`].
54    pub fn new() -> Self {
55        Self { page: None, per_page: None }
56    }
57
58    /// Sets the page number for the request.
59    pub fn page(mut self, page: usize) -> Self {
60        self.page = Some(page);
61        self
62    }
63
64    /// Sets the number of results per page for the request.
65    pub fn per_page(mut self, per_page: usize) -> Self {
66        self.per_page = Some(per_page);
67        self
68    }
69
70    /// Create [`Curated`] from the [`CuratedBuilder`]
71    pub fn build(self) -> Curated {
72        Curated { page: self.page, per_page: self.per_page }
73    }
74}
75
76#[cfg(test)]
77mod tests {
78    use super::*;
79
80    #[test]
81    fn test_page() {
82        let uri = CuratedBuilder::new().page(1).build();
83        assert_eq!("https://api.pexels.com/v1/curated?page=1", uri.create_uri().unwrap());
84    }
85
86    #[test]
87    fn test_per_page() {
88        let uri = CuratedBuilder::new().per_page(1).build();
89        assert_eq!("https://api.pexels.com/v1/curated?per_page=1", uri.create_uri().unwrap());
90    }
91}