flickr_api/
get_sizes.rs

1use crate::*;
2
3/// A size descriptor as returned by flickr
4#[derive(Deserialize, Debug, Hash, Clone)]
5pub struct FlickrSize {
6    /// Internal label for the size format
7    pub label: String,
8    pub width: u32,
9    pub height: u32,
10    /// The url of the photo
11    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    /// [flickr.photos.getSizes](https://www.flickr.com/services/api/flickr.photos.getSizes.html)
44    /// endpoint. Returns the available sizes for the photo of the given ID.
45    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, &params)?;
61        let fetch = self.handle.client.get(url).send().await?;
62        let answer: FlickrGetSizesAnswer = fetch.json().await?;
63
64        answer.to_result()
65    }
66}