pinterest_api/response/
media.rs

1use serde::{Deserialize, Serialize};
2use std::collections::HashMap as Map;
3
4use super::{images::Images, mixed_item::MixedItem};
5
6#[derive(Serialize, Deserialize, Debug, Clone)]
7#[serde(tag = "media_type")]
8#[serde(rename_all = "snake_case")]
9pub enum Media {
10    Image {
11        images: Box<Images>,
12
13        #[serde(flatten, skip_serializing_if = "Map::is_empty")]
14        extra: Map<String, serde_json::Value>,
15    },
16    Video {
17        images: Box<Images>,
18        cover_image_url: String,
19        video_url: Option<String>,
20        duration: Option<i64>,
21        hegith: Option<i64>,
22        width: Option<i64>,
23
24        #[serde(flatten, skip_serializing_if = "Map::is_empty")]
25        extra: Map<String, serde_json::Value>,
26    },
27    MultipleImages {
28        items: Vec<MixedItem>,
29        images: Box<Images>,
30
31        #[serde(flatten, skip_serializing_if = "Map::is_empty")]
32        extra: Map<String, serde_json::Value>,
33    },
34    MultipleVideos {
35        items: Vec<MixedItem>,
36        images: Box<Images>,
37
38        #[serde(flatten, skip_serializing_if = "Map::is_empty")]
39        extra: Map<String, serde_json::Value>,
40    },
41    MultipleMixed {
42        items: Vec<MixedItem>,
43        images: Box<Images>,
44
45        #[serde(flatten)]
46        extra: Map<String, serde_json::Value>,
47    },
48}
49
50impl Default for Media {
51    fn default() -> Self {
52        Self::Image {
53            images: Box::new(Images {
54                ..Default::default()
55            }),
56            extra: Map::new(),
57        }
58    }
59}
60
61#[cfg(test)]
62mod tests {
63    use serde_json::json;
64
65    use super::*;
66
67    // BEARER_CODE=xxx cargo test test_response_media_json -- --nocapture --test-threads=1
68
69    #[tokio::test]
70    async fn test_response_media_json() {
71        let image = Media::Image {
72            images: Box::new(Images {
73                ..Default::default()
74            }),
75            extra: Map::new(),
76        };
77        println!("{}", serde_json::to_string(&image).unwrap());
78
79        let multiple_images = Media::MultipleImages {
80            items: vec![],
81            images: Box::new(Images {
82                ..Default::default()
83            }),
84            extra: Map::new(),
85        };
86        println!("{}", serde_json::to_string(&multiple_images).unwrap());
87
88        let json = json!({
89            "media_type": "image",
90            "images": {
91                "150x150": {
92                    "width": 150,
93                    "height": 150,
94                    "url": "https://example.com/150x150.jpg"
95                },
96                "400x300": {
97                    "width": 150,
98                    "height": 150,
99                    "url": "https://example.com/150x150.jpg"
100                },
101                "600x": {
102                    "width": 150,
103                    "height": 150,
104                    "url": "https://example.com/150x150.jpg"
105                },
106                "1200x": {
107                    "width": 150,
108                    "height": 150,
109                    "url": "https://example.com/150x150.jpg"
110                },
111            },
112            "aaa": "bbb"
113        });
114
115        let image: Media = serde_json::from_value(json).unwrap();
116        println!("{:?}", image);
117    }
118}