pexels_sdk/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()
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 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#[derive(Default)]
49pub struct CuratedBuilder {
50 page: Option<usize>,
51 per_page: Option<usize>,
52}
53
54impl CuratedBuilder {
55 pub fn new() -> Self {
57 Self {
58 page: None,
59 per_page: None,
60 }
61 }
62
63 pub fn page(mut self, page: usize) -> Self {
65 self.page = Some(page);
66 self
67 }
68
69 pub fn per_page(mut self, per_page: usize) -> Self {
71 self.per_page = Some(per_page);
72 self
73 }
74
75 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}