pinterest_api/response/
media.rs1use 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 #[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}