google_maps_places/
response.rs

1use serde::Deserialize;
2
3#[cfg(feature = "async-graphql")]
4use async_graphql::{Enum, SimpleObject};
5
6/// https://developers.google.com/maps/documentation/places/web-service/details#PlacesDetailsStatus
7#[derive(Debug, Deserialize)]
8#[serde(tag = "status")]
9pub enum Response {
10    /// `OK` indicating the API request was successful.
11    /// Includes `PlaceResult` in `result`.
12    #[serde(rename = "OK")]
13    Ok { result: PlaceResult },
14
15    /// `ZERO_RESULTS` indicating that the referenced location, place_id, was valid but no longer refers to a valid result.
16    /// This may occur if the establishment is no longer in business.
17    #[serde(rename = "ZERO_RESULTS")]
18    ZeroResults,
19
20    /// `INVALID_REQUEST` indicating the API request was malformed
21    #[serde(rename = "INVALID_REQUEST")]
22    InvalidRequest,
23
24    /// `OVER_QUERY_LIMIT` indicating any of the following:
25    /// - You have exceeded the QPS limits.
26    /// - Billing has not been enabled on your account.
27    /// - The monthly $200 credit, or a self-imposed usage cap, has been exceeded.
28    /// - The provided method of payment is no longer valid (for example, a credit card has expired).
29    #[serde(rename = "OVER_QUERY_LIMIT")]
30    OverQueryLimit,
31
32    /// `REQUEST_DENIED` indicating that your request was denied, generally because:
33    /// - The request is missing an API key.
34    /// - The `key` parameter is invalid.
35    #[serde(rename = "REQUEST_DENIED")]
36    RequestDenied { error_message: String },
37
38    /// `UNKNOWN_ERROR` indicating an unknown error
39    #[serde(rename = "UNKNOWN_ERROR")]
40    UnknownError,
41}
42
43/// Attributes describing a place
44/// https://developers.google.com/maps/documentation/places/web-service/details#Place
45#[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    /// Obtain address component based on `AddressType`
66    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    /// Obtain street number from `address_components`
79    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    /// Obtain route from `address_components`
87    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    /// Obtain sublocality from `address_components`
95    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    /// Obtain postal code from `address_components`
103    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    /// Obtain city from `address_components`
111    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    /// Obtain state from `address_components`
119    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    /// Obtain country from `address_components`
127    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    /// Obtain country code from `address_components`
135    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}