1use serde::{Deserialize, Serialize};
2
3use super::UrlRetrievalStatus;
4
5#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
6#[serde(rename_all = "camelCase")]
7#[derive(gproxy_protocol_macros::WireBuilder)]
8#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
9pub struct GroundingMetadata {
10 #[serde(default, skip_serializing_if = "Vec::is_empty")]
11 pub grounding_chunks: Vec<GroundingChunk>,
12 #[serde(default, skip_serializing_if = "Vec::is_empty")]
13 pub grounding_supports: Vec<GroundingSupport>,
14 #[serde(default, skip_serializing_if = "Vec::is_empty")]
15 pub web_search_queries: Vec<String>,
16 #[serde(default, skip_serializing_if = "Vec::is_empty")]
17 pub image_search_queries: Vec<String>,
18 #[serde(skip_serializing_if = "Option::is_none")]
19 pub search_entry_point: Option<SearchEntryPoint>,
20 #[serde(skip_serializing_if = "Option::is_none")]
21 pub retrieval_metadata: Option<RetrievalMetadata>,
22 #[serde(skip_serializing_if = "Option::is_none")]
23 pub google_maps_widget_context_token: Option<String>,
24 #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
25 pub rest: serde_json::Map<String, serde_json::Value>,
26}
27
28#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
29#[serde(rename_all = "camelCase")]
30#[derive(gproxy_protocol_macros::WireBuilder)]
31#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
32pub struct SearchEntryPoint {
33 #[serde(skip_serializing_if = "Option::is_none")]
34 pub rendered_content: Option<String>,
35 #[serde(skip_serializing_if = "Option::is_none")]
36 pub sdk_blob: Option<String>,
37 #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
38 pub rest: serde_json::Map<String, serde_json::Value>,
39}
40
41#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
42#[serde(rename_all = "camelCase")]
43#[derive(gproxy_protocol_macros::WireBuilder)]
44#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
45pub struct GroundingChunk {
46 #[serde(flatten, skip_serializing_if = "Option::is_none")]
47 pub source: Option<GroundingChunkSource>,
48 #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
49 pub rest: serde_json::Map<String, serde_json::Value>,
50}
51
52#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
53#[serde(untagged)]
54#[non_exhaustive]
55pub enum GroundingChunkSource {
56 Web {
57 web: WebChunk,
58 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
59 rest: serde_json::Map<String, serde_json::Value>,
60 },
61 Image {
62 image: ImageChunk,
63 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
64 rest: serde_json::Map<String, serde_json::Value>,
65 },
66 RetrievedContext {
67 #[serde(rename = "retrievedContext")]
68 retrieved_context: RetrievedContext,
69 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
70 rest: serde_json::Map<String, serde_json::Value>,
71 },
72 Maps {
73 maps: MapsChunk,
74 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
75 rest: serde_json::Map<String, serde_json::Value>,
76 },
77 Raw(serde_json::Value),
78}
79
80#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
81#[serde(rename_all = "camelCase")]
82#[derive(gproxy_protocol_macros::WireBuilder)]
83#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
84pub struct WebChunk {
85 #[serde(skip_serializing_if = "Option::is_none")]
86 pub uri: Option<String>,
87 #[serde(skip_serializing_if = "Option::is_none")]
88 pub title: Option<String>,
89 #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
90 pub rest: serde_json::Map<String, serde_json::Value>,
91}
92
93#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
94#[serde(rename_all = "camelCase")]
95#[derive(gproxy_protocol_macros::WireBuilder)]
96#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
97pub struct ImageChunk {
98 #[serde(skip_serializing_if = "Option::is_none")]
99 pub source_uri: Option<String>,
100 #[serde(skip_serializing_if = "Option::is_none")]
101 pub image_uri: Option<String>,
102 #[serde(skip_serializing_if = "Option::is_none")]
103 pub title: Option<String>,
104 #[serde(skip_serializing_if = "Option::is_none")]
105 pub domain: Option<String>,
106 #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
107 pub rest: serde_json::Map<String, serde_json::Value>,
108}
109
110#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
111#[serde(rename_all = "camelCase")]
112#[derive(gproxy_protocol_macros::WireBuilder)]
113#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
114pub struct RetrievedContext {
115 #[serde(default, skip_serializing_if = "Vec::is_empty")]
116 pub custom_metadata: Vec<CustomMetadata>,
117 #[serde(skip_serializing_if = "Option::is_none")]
118 pub uri: Option<String>,
119 #[serde(skip_serializing_if = "Option::is_none")]
120 pub title: Option<String>,
121 #[serde(skip_serializing_if = "Option::is_none")]
122 pub text: Option<String>,
123 #[serde(skip_serializing_if = "Option::is_none")]
124 pub file_search_store: Option<String>,
125 #[serde(skip_serializing_if = "Option::is_none")]
126 pub page_number: Option<i32>,
127 #[serde(skip_serializing_if = "Option::is_none")]
128 pub media_id: Option<String>,
129 #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
130 pub rest: serde_json::Map<String, serde_json::Value>,
131}
132
133#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
134#[serde(rename_all = "camelCase")]
135#[derive(gproxy_protocol_macros::WireBuilder)]
136#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
137pub struct CustomMetadata {
138 #[serde(skip_serializing_if = "Option::is_none")]
139 pub key: Option<String>,
140 #[serde(flatten, skip_serializing_if = "Option::is_none")]
141 pub value: Option<CustomMetadataValue>,
142 #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
143 pub rest: serde_json::Map<String, serde_json::Value>,
144}
145
146#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
147#[serde(untagged)]
148#[non_exhaustive]
149pub enum CustomMetadataValue {
150 StringValue {
151 #[serde(rename = "stringValue")]
152 string_value: String,
153 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
154 rest: serde_json::Map<String, serde_json::Value>,
155 },
156 StringListValue {
157 #[serde(rename = "stringListValue")]
158 string_list_value: StringList,
159 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
160 rest: serde_json::Map<String, serde_json::Value>,
161 },
162 NumericValue {
163 #[serde(rename = "numericValue")]
164 numeric_value: f64,
165 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
166 rest: serde_json::Map<String, serde_json::Value>,
167 },
168 Raw(serde_json::Value),
169}
170
171#[derive(
172 Debug, Clone, PartialEq, Serialize, Deserialize, Default, gproxy_protocol_macros::WireBuilder,
173)]
174#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
175pub struct StringList {
176 #[serde(default, skip_serializing_if = "Vec::is_empty")]
177 pub values: Vec<String>,
178 #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
179 pub rest: serde_json::Map<String, serde_json::Value>,
180}
181
182#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
183#[serde(rename_all = "camelCase")]
184#[derive(gproxy_protocol_macros::WireBuilder)]
185#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
186pub struct MapsChunk {
187 #[serde(skip_serializing_if = "Option::is_none")]
188 pub uri: Option<String>,
189 #[serde(skip_serializing_if = "Option::is_none")]
190 pub title: Option<String>,
191 #[serde(skip_serializing_if = "Option::is_none")]
192 pub text: Option<String>,
193 #[serde(skip_serializing_if = "Option::is_none")]
194 pub place_id: Option<String>,
195 #[serde(skip_serializing_if = "Option::is_none")]
196 pub place_answer_sources: Option<PlaceAnswerSources>,
197 #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
198 pub rest: serde_json::Map<String, serde_json::Value>,
199}
200
201#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
202#[serde(rename_all = "camelCase")]
203#[derive(gproxy_protocol_macros::WireBuilder)]
204#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
205pub struct PlaceAnswerSources {
206 #[serde(default, skip_serializing_if = "Vec::is_empty")]
207 pub review_snippets: Vec<ReviewSnippet>,
208 #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
209 pub rest: serde_json::Map<String, serde_json::Value>,
210}
211
212#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
213#[serde(rename_all = "camelCase")]
214#[derive(gproxy_protocol_macros::WireBuilder)]
215#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
216pub struct ReviewSnippet {
217 #[serde(skip_serializing_if = "Option::is_none")]
218 pub review_id: Option<String>,
219 #[serde(skip_serializing_if = "Option::is_none")]
220 pub google_maps_uri: Option<String>,
221 #[serde(skip_serializing_if = "Option::is_none")]
222 pub title: Option<String>,
223 #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
224 pub rest: serde_json::Map<String, serde_json::Value>,
225}
226
227#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
228#[serde(rename_all = "camelCase")]
229#[derive(gproxy_protocol_macros::WireBuilder)]
230#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
231pub struct GroundingSupport {
232 #[serde(default, skip_serializing_if = "Vec::is_empty")]
233 pub grounding_chunk_indices: Vec<i32>,
234 #[serde(default, skip_serializing_if = "Vec::is_empty")]
235 pub confidence_scores: Vec<f64>,
236 #[serde(default, skip_serializing_if = "Vec::is_empty")]
237 pub rendered_parts: Vec<i32>,
238 #[serde(skip_serializing_if = "Option::is_none")]
239 pub segment: Option<Segment>,
240 #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
241 pub rest: serde_json::Map<String, serde_json::Value>,
242}
243
244#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
245#[serde(rename_all = "camelCase")]
246#[derive(gproxy_protocol_macros::WireBuilder)]
247#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
248pub struct Segment {
249 #[serde(skip_serializing_if = "Option::is_none")]
250 pub part_index: Option<i32>,
251 #[serde(skip_serializing_if = "Option::is_none")]
252 pub start_index: Option<i32>,
253 #[serde(skip_serializing_if = "Option::is_none")]
254 pub end_index: Option<i32>,
255 #[serde(skip_serializing_if = "Option::is_none")]
256 pub text: Option<String>,
257 #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
258 pub rest: serde_json::Map<String, serde_json::Value>,
259}
260
261#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
262#[serde(rename_all = "camelCase")]
263#[derive(gproxy_protocol_macros::WireBuilder)]
264#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
265pub struct RetrievalMetadata {
266 #[serde(skip_serializing_if = "Option::is_none")]
267 pub google_search_dynamic_retrieval_score: Option<f64>,
268 #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
269 pub rest: serde_json::Map<String, serde_json::Value>,
270}
271
272#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
273#[serde(rename_all = "camelCase")]
274#[derive(gproxy_protocol_macros::WireBuilder)]
275#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
276pub struct UrlContextMetadata {
277 #[serde(default, skip_serializing_if = "Vec::is_empty")]
278 pub url_metadata: Vec<UrlMetadata>,
279 #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
280 pub rest: serde_json::Map<String, serde_json::Value>,
281}
282
283#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
284#[serde(rename_all = "camelCase")]
285#[derive(gproxy_protocol_macros::WireBuilder)]
286#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
287pub struct UrlMetadata {
288 #[serde(skip_serializing_if = "Option::is_none")]
289 pub retrieved_url: Option<String>,
290 #[serde(skip_serializing_if = "Option::is_none")]
291 pub url_retrieval_status: Option<UrlRetrievalStatus>,
292 #[serde(default, skip_serializing_if = "serde_json::Map::is_empty", flatten)]
293 pub rest: serde_json::Map<String, serde_json::Value>,
294}