insta/types/
additional_data_loaded.rs1use std::collections::HashMap;
2use url::Url;
3
4#[derive(Debug)]
6pub struct InvalidMediaTypeError(u8);
7
8impl std::fmt::Display for InvalidMediaTypeError {
9 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10 write!(f, "`{}` is not a valid media type", self.0)
11 }
12}
13
14impl std::error::Error for InvalidMediaTypeError {}
15
16#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, serde::Deserialize)]
17#[serde(try_from = "u8")]
18pub enum MediaType {
19 Photo,
21
22 Video,
24
25 Carousel,
27}
28
29impl TryFrom<u8> for MediaType {
30 type Error = InvalidMediaTypeError;
31
32 fn try_from(n: u8) -> Result<Self, Self::Error> {
33 match n {
34 1 => Ok(Self::Photo),
35 2 => Ok(Self::Video),
36 8 => Ok(Self::Carousel),
37 _ => Err(InvalidMediaTypeError(n)),
38 }
39 }
40}
41
42#[derive(Debug, serde::Deserialize)]
44pub struct AdditionalDataLoaded {
45 pub num_results: u32,
47
48 pub items: Vec<AdditionalDataLoadedItem>,
50
51 pub auto_load_more_enabled: bool,
53
54 pub more_available: bool,
56
57 #[serde(flatten)]
59 pub extra: HashMap<String, serde_json::Value>,
60}
61
62#[derive(Debug, serde::Deserialize)]
63pub struct AdditionalDataLoadedItem {
64 pub media_type: MediaType,
66
67 pub video_versions: Option<Vec<VideoVersion>>,
71
72 pub image_versions2: Option<ImageVersions2>,
74
75 pub carousel_media: Option<Vec<CarouselMediaItem>>,
77
78 pub code: String,
80
81 #[serde(flatten)]
83 pub extra: HashMap<String, serde_json::Value>,
84}
85
86impl AdditionalDataLoadedItem {
87 pub fn get_best_image_versions2_candidate(&self) -> Option<&ImageVersions2Candidate> {
89 self.image_versions2.as_ref()?.get_best()
90 }
91
92 pub fn get_best_video_version(&self) -> Option<&VideoVersion> {
94 self.video_versions
95 .as_ref()?
96 .iter()
97 .max_by_key(|video_version| video_version.height)
98 }
99}
100
101#[derive(Debug, serde::Deserialize)]
102pub struct VideoVersion {
103 pub height: u32,
105
106 pub width: u32,
108
109 #[serde(rename = "type")]
111 pub kind: u32,
112
113 pub url: Url,
115
116 pub id: String,
118
119 #[serde(flatten)]
121 pub extra: HashMap<String, serde_json::Value>,
122}
123
124#[derive(Debug, serde::Deserialize)]
126pub struct ImageVersions2 {
127 pub candidates: Vec<ImageVersions2Candidate>,
129
130 #[serde(flatten)]
132 pub extra: HashMap<String, serde_json::Value>,
133}
134
135impl ImageVersions2 {
136 pub fn get_best(&self) -> Option<&ImageVersions2Candidate> {
138 self.candidates
139 .iter()
140 .max_by_key(|image_versions2_candidate| image_versions2_candidate.height)
141 }
142}
143
144#[derive(Debug, serde::Deserialize)]
146pub struct ImageVersions2Candidate {
147 pub width: u32,
149
150 pub height: u32,
152
153 pub url: Url,
155
156 #[serde(flatten)]
158 pub extra: HashMap<String, serde_json::Value>,
159}
160
161#[derive(Debug, serde::Deserialize)]
163pub struct CarouselMediaItem {
164 pub media_type: MediaType,
166
167 pub image_versions2: Option<ImageVersions2>,
169
170 #[serde(flatten)]
172 pub extra: HashMap<String, serde_json::Value>,
173}
174
175impl CarouselMediaItem {
176 pub fn get_best_image_versions2_candidate(&self) -> Option<&ImageVersions2Candidate> {
178 self.image_versions2.as_ref()?.get_best()
179 }
180}