1use crate::*;
2
3#[derive(Deserialize, Debug, Hash, Clone)]
5pub struct FlickrSize {
6 pub label: String,
8 pub width: u32,
9 pub height: u32,
10 pub source: String,
12}
13
14#[derive(Deserialize, Debug, Hash)]
15struct FlickrSizes {
16 size: Vec<FlickrSize>,
17}
18
19#[derive(Deserialize, Debug, Hash)]
20struct FlickrSizeWrapper {
21 sizes: FlickrSizes,
22}
23
24#[derive(Deserialize, Debug, Hash)]
25#[serde(untagged)]
26enum FlickrGetSizesAnswer {
27 Ok(FlickrSizeWrapper),
28 Err(FlickrError),
29}
30
31impl Resultable<Vec<FlickrSize>, Box<dyn Error>> for FlickrGetSizesAnswer {
32 fn to_result(self) -> Result<Vec<FlickrSize>, Box<dyn Error>> {
33 match self {
34 FlickrGetSizesAnswer::Ok(FlickrSizeWrapper {
35 sizes: FlickrSizes { size },
36 }) => Ok(size),
37 FlickrGetSizesAnswer::Err(e) => Err(Box::new(e)),
38 }
39 }
40}
41
42impl PhotoRequestBuilder {
43 pub async fn get_sizes(&self, id: &String) -> Result<Vec<FlickrSize>, Box<dyn Error>> {
46 let mut params = vec![
47 ("nojsoncallback", "1".into()),
48 ("method", "flickr.photos.getSizes".into()),
49 ("format", "json".into()),
50 ("api_key", self.handle.key.key.clone()),
51 ("photo_id", id.clone()),
52 ];
53 oauth::build_request(
54 oauth::RequestTarget::Get(URL_API),
55 &mut params,
56 &self.handle.key,
57 self.handle.token.as_ref(),
58 );
59
60 let url = reqwest::Url::parse_with_params(URL_API, ¶ms)?;
61 let fetch = self.handle.client.get(url).send().await?;
62 let answer: FlickrGetSizesAnswer = fetch.json().await?;
63
64 answer.to_result()
65 }
66}