pexels_api/photos/
curated.rs1use crate::{Pexels, PexelsError, PhotosResponse, PEXELS_API, PEXELS_VERSION};
2use url::Url;
3
4const PEXELS_CURATED_PATH: &str = "curated";
6
7pub struct Curated {
9 page: Option<usize>,
10 per_page: Option<usize>,
11}
12
13impl Curated {
14 pub fn builder() -> CuratedBuilder {
16 CuratedBuilder::default()
17 }
18
19 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 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#[derive(Default)]
47pub struct CuratedBuilder {
48 page: Option<usize>,
49 per_page: Option<usize>,
50}
51
52impl CuratedBuilder {
53 pub fn new() -> Self {
55 Self { page: None, per_page: None }
56 }
57
58 pub fn page(mut self, page: usize) -> Self {
60 self.page = Some(page);
61 self
62 }
63
64 pub fn per_page(mut self, per_page: usize) -> Self {
66 self.per_page = Some(per_page);
67 self
68 }
69
70 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}