1use serde::Deserialize;
2
3#[cfg(feature = "async-graphql")]
4use async_graphql::{Enum, SimpleObject};
5
6#[derive(Debug, Deserialize)]
8#[serde(tag = "status")]
9pub enum Response {
10 #[serde(rename = "OK")]
13 Ok { result: PlaceResult },
14
15 #[serde(rename = "ZERO_RESULTS")]
18 ZeroResults,
19
20 #[serde(rename = "INVALID_REQUEST")]
22 InvalidRequest,
23
24 #[serde(rename = "OVER_QUERY_LIMIT")]
30 OverQueryLimit,
31
32 #[serde(rename = "REQUEST_DENIED")]
36 RequestDenied { error_message: String },
37
38 #[serde(rename = "UNKNOWN_ERROR")]
40 UnknownError,
41}
42
43#[derive(Debug, Deserialize)]
46#[cfg_attr(feature = "async-graphql", derive(SimpleObject))]
47pub struct PlaceResult {
48 pub address_components: Option<Vec<AddressComponent>>,
49 pub adr_address: Option<String>,
50 pub formatted_address: Option<String>,
51 pub geometry: Option<PlaceGeometry>,
52 pub icon: Option<String>,
53 pub icon_background_color: Option<String>,
54 pub icon_mask_base_uri: Option<String>,
55 pub name: Option<String>,
56 pub place_id: Option<String>,
57 pub reference: Option<String>,
58 pub types: Option<Vec<AddressType>>,
59 pub url: Option<String>,
60 pub utc_offset: Option<i32>,
61 pub vicinity: Option<String>,
62}
63
64impl PlaceResult {
65 pub fn address_component(&self, address_type: &AddressType) -> Option<&AddressComponent> {
67 match self.address_components.as_ref() {
68 Some(ac) => ac
69 .iter()
70 .find(|&c| match c.types.iter().find(|&t| t == address_type) {
71 Some(_) => true,
72 None => false,
73 }),
74 None => None,
75 }
76 }
77
78 pub fn street_number(&self) -> Option<&str> {
80 match self.address_component(&AddressType::StreetNumber) {
81 Some(ac) => Some(&ac.long_name),
82 None => None,
83 }
84 }
85
86 pub fn route(&self) -> Option<&str> {
88 match self.address_component(&AddressType::Route) {
89 Some(ac) => Some(&ac.long_name),
90 None => None,
91 }
92 }
93
94 pub fn sublocality(&self) -> Option<&str> {
96 match self.address_component(&AddressType::Sublocality) {
97 Some(ac) => Some(&ac.long_name),
98 None => None,
99 }
100 }
101
102 pub fn postal_code(&self) -> Option<&str> {
104 match self.address_component(&AddressType::PostalCode) {
105 Some(ac) => Some(&ac.long_name),
106 None => None,
107 }
108 }
109
110 pub fn city(&self) -> Option<&str> {
112 match self.address_component(&AddressType::Locality) {
113 Some(ac) => Some(&ac.long_name),
114 None => None,
115 }
116 }
117
118 pub fn state(&self) -> Option<&str> {
120 match self.address_component(&AddressType::AdministrativeAreaLevel1) {
121 Some(ac) => Some(&ac.long_name),
122 None => None,
123 }
124 }
125
126 pub fn country(&self) -> Option<&str> {
128 match self.address_component(&AddressType::Country) {
129 Some(ac) => Some(&ac.long_name),
130 None => None,
131 }
132 }
133
134 pub fn country_code(&self) -> Option<&str> {
136 match self.address_component(&AddressType::Country) {
137 Some(ac) => Some(&ac.short_name),
138 None => None,
139 }
140 }
141}
142
143#[derive(Debug, Deserialize)]
144#[cfg_attr(feature = "async-graphql", derive(SimpleObject))]
145pub struct PlaceGeometry {
146 pub location: PlaceLatLng,
147 pub viewport: Viewport,
148}
149
150#[derive(Debug, Deserialize)]
151#[cfg_attr(feature = "async-graphql", derive(SimpleObject))]
152pub struct Viewport {
153 pub northeast: PlaceLatLng,
154 pub southwest: PlaceLatLng,
155}
156
157#[derive(Debug, Deserialize)]
158#[cfg_attr(feature = "async-graphql", derive(SimpleObject))]
159pub struct PlaceLatLng {
160 pub lat: f64,
161 pub lng: f64,
162}
163
164#[derive(Debug, Deserialize)]
165#[cfg_attr(feature = "async-graphql", derive(SimpleObject))]
166pub struct AddressComponent {
167 long_name: String,
168 short_name: String,
169 types: Vec<AddressType>,
170}
171
172#[derive(Debug, Deserialize, Copy, Clone, Eq, PartialEq)]
173#[cfg_attr(feature = "async-graphql", derive(Enum))]
174pub enum AddressType {
175 #[serde(rename = "accounting")]
176 Accounting,
177
178 #[serde(rename = "airport")]
179 Airport,
180
181 #[serde(rename = "amusement_park")]
182 AmusementPark,
183
184 #[serde(rename = "aquarium")]
185 Aquarium,
186
187 #[serde(rename = "art_gallery")]
188 ArtGallery,
189
190 #[serde(rename = "atm")]
191 Atm,
192
193 #[serde(rename = "bakery")]
194 Bakery,
195
196 #[serde(rename = "bank")]
197 Bank,
198
199 #[serde(rename = "bar")]
200 Bar,
201
202 #[serde(rename = "beauty_salon")]
203 BeautySalon,
204
205 #[serde(rename = "bicycle_store")]
206 BicycleStore,
207
208 #[serde(rename = "book_store")]
209 BookStore,
210
211 #[serde(rename = "bowling_alley")]
212 BowlingAlley,
213
214 #[serde(rename = "bus_station")]
215 BusStation,
216
217 #[serde(rename = "cafe")]
218 Cafe,
219
220 #[serde(rename = "campground")]
221 Campground,
222
223 #[serde(rename = "car_dealer")]
224 CarDealer,
225
226 #[serde(rename = "car_rental")]
227 CarRental,
228
229 #[serde(rename = "car_repair")]
230 CarRepair,
231
232 #[serde(rename = "car_wash")]
233 CarWash,
234
235 #[serde(rename = "casino")]
236 Casino,
237
238 #[serde(rename = "cemetery")]
239 Cemetery,
240
241 #[serde(rename = "church")]
242 Church,
243
244 #[serde(rename = "city_hall")]
245 CityHall,
246
247 #[serde(rename = "clothing_store")]
248 ClothingStore,
249
250 #[serde(rename = "convenience_store")]
251 ConvenienceStore,
252
253 #[serde(rename = "courthouse")]
254 Courthouse,
255
256 #[serde(rename = "dentist")]
257 Dentist,
258
259 #[serde(rename = "department_store")]
260 DepartmentStore,
261
262 #[serde(rename = "doctor")]
263 Doctor,
264
265 #[serde(rename = "drugstore")]
266 Drugstore,
267
268 #[serde(rename = "electrician")]
269 Electrician,
270
271 #[serde(rename = "electronics_store")]
272 ElectronicsStore,
273
274 #[serde(rename = "embassy")]
275 Embassy,
276
277 #[serde(rename = "fire_station")]
278 FireStation,
279
280 #[serde(rename = "florist")]
281 Florist,
282
283 #[serde(rename = "funeral_home")]
284 FuneralHome,
285
286 #[serde(rename = "furniture_store")]
287 FurnitureStore,
288
289 #[serde(rename = "gas_station")]
290 GasStation,
291
292 #[serde(rename = "gym")]
293 Gym,
294
295 #[serde(rename = "hair_care")]
296 HairCare,
297
298 #[serde(rename = "hardware_store")]
299 HardwareStore,
300
301 #[serde(rename = "hindu_temple")]
302 HinduTemple,
303
304 #[serde(rename = "home_goods_store")]
305 HomeGoodsStore,
306
307 #[serde(rename = "hospital")]
308 Hospital,
309
310 #[serde(rename = "insurance_agency")]
311 InsuranceAgency,
312
313 #[serde(rename = "jewelry_store")]
314 JewelryStore,
315
316 #[serde(rename = "laundry")]
317 Laundry,
318
319 #[serde(rename = "lawyer")]
320 Lawyer,
321
322 #[serde(rename = "library")]
323 Library,
324
325 #[serde(rename = "light_rail_station")]
326 LightRailStation,
327
328 #[serde(rename = "liquor_store")]
329 LiquorStore,
330
331 #[serde(rename = "local_government_office")]
332 LocalGovernmentOffice,
333
334 #[serde(rename = "locksmith")]
335 Locksmith,
336
337 #[serde(rename = "lodging")]
338 Lodging,
339
340 #[serde(rename = "meal_delivery")]
341 MealDelivery,
342
343 #[serde(rename = "meal_takeaway")]
344 MealTakeaway,
345
346 #[serde(rename = "mosque")]
347 Mosque,
348
349 #[serde(rename = "movie_rental")]
350 MovieRental,
351
352 #[serde(rename = "movie_theater")]
353 MovieTheater,
354
355 #[serde(rename = "moving_company")]
356 MovingCompany,
357
358 #[serde(rename = "museum")]
359 Museum,
360
361 #[serde(rename = "night_club")]
362 NightClub,
363
364 #[serde(rename = "painter")]
365 Painter,
366
367 #[serde(rename = "park")]
368 Park,
369
370 #[serde(rename = "parking")]
371 Parking,
372
373 #[serde(rename = "pet_store")]
374 PetStore,
375
376 #[serde(rename = "pharmacy")]
377 Pharmacy,
378
379 #[serde(rename = "physiotherapist")]
380 Physiotherapist,
381
382 #[serde(rename = "plumber")]
383 Plumber,
384
385 #[serde(rename = "police")]
386 Police,
387
388 #[serde(rename = "post_office")]
389 PostOffice,
390
391 #[serde(rename = "primary_school")]
392 PrimarySchool,
393
394 #[serde(rename = "real_estate_agency")]
395 RealEstateAgency,
396
397 #[serde(rename = "restaurant")]
398 Restaurant,
399
400 #[serde(rename = "roofing_contractor")]
401 RoofingContractor,
402
403 #[serde(rename = "rv_park")]
404 RvPark,
405
406 #[serde(rename = "school")]
407 School,
408
409 #[serde(rename = "secondary_school")]
410 SecondarySchool,
411
412 #[serde(rename = "shoe_store")]
413 ShoeStore,
414
415 #[serde(rename = "shopping_mall")]
416 ShoppingMall,
417
418 #[serde(rename = "spa")]
419 Spa,
420
421 #[serde(rename = "stadium")]
422 Stadium,
423
424 #[serde(rename = "storage")]
425 Storage,
426
427 #[serde(rename = "store")]
428 Store,
429
430 #[serde(rename = "subway_station")]
431 SubwayStation,
432
433 #[serde(rename = "supermarket")]
434 Supermarket,
435
436 #[serde(rename = "synagogue")]
437 Synagogue,
438
439 #[serde(rename = "taxi_stand")]
440 TaxiStand,
441
442 #[serde(rename = "tourist_attraction")]
443 TouristAttraction,
444
445 #[serde(rename = "train_station")]
446 TrainStation,
447
448 #[serde(rename = "transit_station")]
449 TransitStation,
450
451 #[serde(rename = "travel_agency")]
452 TravelAgency,
453
454 #[serde(rename = "university")]
455 University,
456
457 #[serde(rename = "veterinary_care")]
458 VeterinaryCare,
459
460 #[serde(rename = "zoo")]
461 Zoo,
462
463 #[serde(rename = "administrative_area_level_1")]
464 AdministrativeAreaLevel1,
465
466 #[serde(rename = "administrative_area_level_2")]
467 AdministrativeAreaLevel2,
468
469 #[serde(rename = "administrative_area_level_3")]
470 AdministrativeAreaLevel3,
471
472 #[serde(rename = "administrative_area_level_4")]
473 AdministrativeAreaLevel4,
474
475 #[serde(rename = "administrative_area_level_5")]
476 AdministrativeAreaLevel5,
477
478 #[serde(rename = "archipelago")]
479 Archipelago,
480
481 #[serde(rename = "colloquial_area")]
482 ColloquialArea,
483
484 #[serde(rename = "continent")]
485 Continent,
486
487 #[serde(rename = "country")]
488 Country,
489
490 #[serde(rename = "establishment")]
491 Establishment,
492
493 #[serde(rename = "finance")]
494 Finance,
495
496 #[serde(rename = "floor")]
497 Floor,
498
499 #[serde(rename = "food")]
500 Food,
501
502 #[serde(rename = "general_contractor")]
503 GeneralContractor,
504
505 #[serde(rename = "geocode")]
506 Geocode,
507
508 #[serde(rename = "health")]
509 Health,
510
511 #[serde(rename = "intersection")]
512 Intersection,
513
514 #[serde(rename = "landmark")]
515 Landmark,
516
517 #[serde(rename = "locality")]
518 Locality,
519
520 #[serde(rename = "natural_feature")]
521 NaturalFeature,
522
523 #[serde(rename = "neighborhood")]
524 Neighborhood,
525
526 #[serde(rename = "place_of_worship")]
527 PlaceOfWorship,
528
529 #[serde(rename = "plus_code")]
530 PlusCode,
531
532 #[serde(rename = "point_of_interest")]
533 PointOfInterest,
534
535 #[serde(rename = "political")]
536 Political,
537
538 #[serde(rename = "post_box")]
539 PostBox,
540
541 #[serde(rename = "postal_code")]
542 PostalCode,
543
544 #[serde(rename = "postal_code_prefix")]
545 PostalCodePrefix,
546
547 #[serde(rename = "postal_code_suffix")]
548 PostalCodeSuffix,
549
550 #[serde(rename = "postal_town")]
551 PostalTown,
552
553 #[serde(rename = "premise")]
554 Premise,
555
556 #[serde(rename = "room")]
557 Room,
558
559 #[serde(rename = "route")]
560 Route,
561
562 #[serde(rename = "street_address")]
563 StreetAddress,
564
565 #[serde(rename = "street_number")]
566 StreetNumber,
567
568 #[serde(rename = "sublocality")]
569 Sublocality,
570
571 #[serde(rename = "sublocality_level_1")]
572 SublocalityLevel1,
573
574 #[serde(rename = "sublocality_level_2")]
575 SublocalityLevel2,
576
577 #[serde(rename = "sublocality_level_3")]
578 SublocalityLevel3,
579
580 #[serde(rename = "sublocality_level_4")]
581 SublocalityLevel4,
582
583 #[serde(rename = "sublocality_level_5")]
584 SublocalityLevel5,
585
586 #[serde(rename = "subpremise")]
587 Subpremise,
588
589 #[serde(rename = "town_square")]
590 TownSquare,
591}