google_geocode/
lib.rs

1/*!
2 * A rust library for interacting with the Geocode API.
3 *
4 * For more information, the Geocode API documentation is available at:
5 * https://developers.google.com/maps/documentation/geocoding/overview
6 *
7 * Example:
8 *
9 * ```
10 * use google_geocode::Geocode;
11 * use serde::{Deserialize, Serialize};
12 *
13 * async fn geocode() {
14 *     // Initialize the Geocode client.
15 *     let geocode = Geocode::new_from_env();
16 *
17 *     // Get geolocation data.
18 *     let g = geocode.get("some address").await.unwrap();
19 *
20 *     println!("{:?}", g);
21 * }
22 * ```
23 */
24#![allow(clippy::field_reassign_with_default)]
25use std::env;
26use std::error;
27use std::fmt::{self, Debug, Display, Formatter};
28use std::hash::Hash;
29use std::sync::Arc;
30
31use reqwest::{header, Client, Method, Request, StatusCode, Url};
32use serde::{Deserialize, Serialize};
33
34/// Endpoint for the Geocode API.
35const ENDPOINT: &str = "https://maps.google.com/maps/api/geocode/json";
36
37/// Entrypoint for interacting with the Geocode API.
38pub struct Geocode {
39    key: String,
40
41    client: Arc<Client>,
42}
43
44impl Geocode {
45    /// Create a new Geocode client struct. It takes a type that can convert into
46    /// an &str (`String` or `Vec<u8>` for example). As long as the function is
47    /// given a valid API key your requests will work.
48    pub fn new<K>(key: K) -> Self
49    where
50        K: ToString,
51    {
52        let client = Client::builder().build();
53        match client {
54            Ok(c) => Self {
55                key: key.to_string(),
56
57                client: Arc::new(c),
58            },
59            Err(e) => panic!("creating client failed: {:?}", e),
60        }
61    }
62
63    /// Create a new Geocode client struct from environment variables. It
64    /// takes a type that can convert into
65    /// an &str (`String` or `Vec<u8>` for example). As long as the function is
66    /// given a valid API key and your requests will work.
67    pub fn new_from_env() -> Self {
68        let key = env::var("GOOGLE_GEOCODE_API_KEY").unwrap();
69
70        Geocode::new(key)
71    }
72
73    fn request<B>(&self, method: Method, path: &str, body: B, query: Option<Vec<(&str, String)>>) -> Request
74    where
75        B: Serialize,
76    {
77        let base = Url::parse(ENDPOINT).unwrap();
78        let url = base.join(path).unwrap();
79
80        // Set the default headers.
81        let mut headers = header::HeaderMap::new();
82        headers.append(header::CONTENT_TYPE, header::HeaderValue::from_static("application/json"));
83
84        let mut rb = self.client.request(method.clone(), url).headers(headers).basic_auth(&self.key, Some(""));
85
86        match query {
87            None => (),
88            Some(val) => {
89                rb = rb.query(&val);
90            }
91        }
92
93        // Add the body, this is to ensure our GET and DELETE calls succeed.
94        if method != Method::GET && method != Method::DELETE {
95            rb = rb.json(&body);
96        }
97
98        // Build the request.
99        rb.build().unwrap()
100    }
101
102    /// Get information for an address.
103    pub async fn get(&self, address: &str) -> Result<Reply, APIError> {
104        // Build the request.
105        let request = self.request(Method::GET, "", (), Some(vec![("address", address.to_string()), ("key", self.key.to_string())]));
106
107        let resp = self.client.execute(request).await.unwrap();
108        match resp.status() {
109            StatusCode::OK => (),
110            s => {
111                return Err(APIError {
112                    status_code: s,
113                    body: resp.text().await.unwrap(),
114                })
115            }
116        };
117
118        let r: ReplyResult = resp.json().await.unwrap();
119        if r.results.is_empty() {
120            return Err(APIError {
121                status_code: StatusCode::NOT_FOUND,
122                body: "".to_string(),
123            });
124        }
125        Ok(r.results.get(0).unwrap().clone())
126    }
127}
128
129/// Error type returned by our library.
130pub struct APIError {
131    pub status_code: StatusCode,
132    pub body: String,
133}
134
135impl fmt::Display for APIError {
136    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
137        write!(f, "APIError: status code -> {}, body -> {}", self.status_code.to_string(), self.body)
138    }
139}
140
141impl fmt::Debug for APIError {
142    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
143        write!(f, "APIError: status code -> {}, body -> {}", self.status_code.to_string(), self.body)
144    }
145}
146
147// This is important for other errors to wrap this one.
148impl error::Error for APIError {
149    fn source(&self) -> Option<&(dyn error::Error + 'static)> {
150        // Generic error, underlying cause isn't tracked.
151        None
152    }
153}
154
155/// One component of a separated address
156#[derive(Debug, Clone, Deserialize, Serialize)]
157pub struct AddressComponent {
158    /// The full text description or name of the address component as returned by the Geocoder.
159    #[serde(default)]
160    long_name: String,
161    /// An abbreviated textual name for the address component, if available.
162    /// For example, an address component for the state of Alaska may have a long_name of "Alaska" and a short_name of "AK" using the 2-letter postal abbreviation.
163    #[serde(default)]
164    short_name: String,
165    /// The type of the address component.
166    #[serde(default)]
167    types: Vec<String>,
168}
169
170/// Position information
171#[derive(Debug, Clone, Deserialize)]
172pub struct Geometry {
173    /// The geocoded latitude, longitude value.
174    /// For normal address lookups, this field is typically the most important.
175    pub location: Coordinates,
176    /// Stores additional data about the specified location
177    pub location_type: LocationType,
178    /// the recommended viewport for displaying the returned result, specified as two latitude,longitude values defining the southwest and northeast corner of the viewport bounding box. Generally the viewport is used to frame a result when displaying it to a user.
179    pub viewport: Viewport,
180    /// The bounding box which can fully contain the returned result.
181    /// Note that these bounds may not match the recommended viewport. (For example, San Francisco includes the Farallon islands, which are technically part of the city, but probably should not be returned in the viewport.)
182    pub bounds: Option<Viewport>,
183}
184
185/// What location Geometry refers to
186#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
187#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
188pub enum LocationType {
189    /// Indicates that the returned result is a precise geocode
190    /// for which we have location information accurate down to street address precision.
191    Rooftop,
192
193    /// Indicates that the returned result reflects an approximation (usually on a road)
194    /// interpolated between two precise points (such as intersections).
195    /// Interpolated results are generally returned when rooftop geocodes
196    /// are unavailable for a street address.
197    RangeInterpolated,
198
199    /// Indicates that the returned result is the geometric center of a result
200    /// such as a polyline (for example, a street) or polygon (region).
201    GeometricCenter,
202
203    /// Indicates that the returned result is approximate.
204    Approximate,
205}
206
207/// A human-readable address of this location.
208#[derive(Debug, Clone, Deserialize)]
209pub struct FormattedAddress(String);
210
211impl Display for FormattedAddress {
212    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
213        Display::fmt(&self.0, f)
214    }
215}
216
217#[derive(Debug, Default, Deserialize)]
218struct ReplyResult {
219    #[serde(default)]
220    error_message: String,
221    #[serde(default)]
222    results: Vec<Reply>,
223    #[serde(default)]
224    status: String,
225}
226
227/// A reply from the Google geocoding API
228#[derive(Debug, Clone, Deserialize)]
229pub struct Reply {
230    /// The separate components applicable to this address.
231    #[serde(default)]
232    pub address_components: Vec<AddressComponent>,
233    /// The human-readable address of this location.
234    ///
235    /// Often this address is equivalent to the postal address. Note that some countries, such as the United Kingdom, do not allow distribution of true postal addresses due to licensing restrictions.
236    ///
237    /// The formatted address is logically composed of one or more address components. For example, the address "111 8th Avenue, New York, NY" consists of the following components: "111" (the street number), "8th Avenue" (the route), "New York" (the city) and "NY" (the US state).
238    ///
239    /// Do not parse the formatted address programmatically. Instead you should use the individual address components, which the API response includes in addition to the formatted address field.
240    pub formatted_address: FormattedAddress,
241    /// Position information
242    pub geometry: Geometry,
243    /// A unique identifier that can be used with other Google APIs.
244    pub place_id: PlaceId,
245    /// All the localities contained in a postal code.
246    /// This is only present when the result is a postal code that contains multiple localities.
247    #[serde(default)]
248    pub postcode_localities: Vec<String>,
249
250    /// The type of the returned result. This array contains a set of zero or more tags identifying the type of feature returned in the result. For example, a geocode of "Chicago" returns "locality" which indicates that "Chicago" is a city, and also returns "political" which indicates it is a political entity.
251    #[serde(default)]
252    pub types: Vec<String>,
253}
254
255#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
256pub struct Viewport {
257    /// Northeast corner of the bounding box
258    pub northeast: Coordinates,
259    /// Southwest corner of the bounding box
260    pub southwest: Coordinates,
261}
262
263/// Language that gets serialized as a language code
264///
265/// From https://developers.google.com/maps/faq#languagesupport
266#[derive(Clone, Copy, Debug, Serialize)]
267#[allow(dead_code)]
268pub enum Language {
269    /// Arabic (ar)
270    #[serde(rename = "ar")]
271    Arabic,
272    /// Bulgarian (bg)
273    #[serde(rename = "bg")]
274    Bulgarian,
275    /// Bengali (bn)
276    #[serde(rename = "bn")]
277    Bengali,
278    /// Catalan (ca)
279    #[serde(rename = "ca")]
280    Catalan,
281    /// Czech (cs)
282    #[serde(rename = "cs")]
283    Czech,
284    /// Danish (da)
285    #[serde(rename = "da")]
286    Danish,
287    /// German (de)
288    #[serde(rename = "de")]
289    German,
290    /// Greek (el)
291    #[serde(rename = "el")]
292    Greek,
293    /// English (en)
294    #[serde(rename = "en")]
295    English,
296    /// EnglishAustralian (en-AU)
297    #[serde(rename = "en-AU")]
298    EnglishAustralian,
299    /// EnglishGreatBritain (en-GB)
300    #[serde(rename = "en-GB")]
301    EnglishGreatBritain,
302    /// Spanish (es)
303    #[serde(rename = "es")]
304    Spanish,
305    /// Basque (eu)
306    #[serde(rename = "eu")]
307    Basque,
308    /// Farsi (fa)
309    #[serde(rename = "fa")]
310    Farsi,
311    /// Finnish (fi)
312    #[serde(rename = "fi")]
313    Finnish,
314    /// Filipino (fil)
315    #[serde(rename = "fil")]
316    Filipino,
317    /// French (fr)
318    #[serde(rename = "fr")]
319    French,
320    /// Galician (gl)
321    #[serde(rename = "gl")]
322    Galician,
323    /// Gujarati (gu)
324    #[serde(rename = "gu")]
325    Gujarati,
326    /// Hindi (hi)
327    #[serde(rename = "hi")]
328    Hindi,
329    /// Croatian (hr)
330    #[serde(rename = "hr")]
331    Croatian,
332    /// Hungarian (hu)
333    #[serde(rename = "hu")]
334    Hungarian,
335    /// Indonesian (id)
336    #[serde(rename = "id")]
337    Indonesian,
338    /// Italian (it)
339    #[serde(rename = "it")]
340    Italian,
341    /// Hebrew (iw)
342    #[serde(rename = "iw")]
343    Hebrew,
344    /// Japanese (ja)
345    #[serde(rename = "ja")]
346    Japanese,
347    /// Kannada (kn)
348    #[serde(rename = "kn")]
349    Kannada,
350    /// Korean (ko)
351    #[serde(rename = "ko")]
352    Korean,
353    /// Lithuanian (lt)
354    #[serde(rename = "lt")]
355    Lithuanian,
356    /// Latvian (lv)
357    #[serde(rename = "lv")]
358    Latvian,
359    /// Malayalam (ml)
360    #[serde(rename = "ml")]
361    Malayalam,
362    /// Marathi (mr)
363    #[serde(rename = "mr")]
364    Marathi,
365    /// Dutch (nl)
366    #[serde(rename = "nl")]
367    Dutch,
368    /// Norwegian (no)
369    #[serde(rename = "no")]
370    Norwegian,
371    /// Polish (pl)
372    #[serde(rename = "pl")]
373    Polish,
374    /// Portuguese (pt)
375    #[serde(rename = "pt")]
376    Portuguese,
377    /// PortugueseBrazil (pt-BR)
378    #[serde(rename = "pt-BR")]
379    PortugueseBrazil,
380    /// PortuguesePortugal (pt-PT)
381    #[serde(rename = "pt-PT")]
382    PortuguesePortugal,
383    /// Romanian (ro)
384    #[serde(rename = "ro")]
385    Romanian,
386    /// Russian (ru)
387    #[serde(rename = "ru")]
388    Russian,
389    /// Slovak (sk)
390    #[serde(rename = "sk")]
391    Slovak,
392    /// Slovenian (sl)
393    #[serde(rename = "sl")]
394    Slovenian,
395    /// Serbian (sr)
396    #[serde(rename = "sr")]
397    Serbian,
398    /// Swedish (sv)
399    #[serde(rename = "sv")]
400    Swedish,
401    /// Tamil (ta)
402    #[serde(rename = "ta")]
403    Tamil,
404    /// Telugu (te)
405    #[serde(rename = "te")]
406    Telugu,
407    /// Thai (th)
408    #[serde(rename = "th")]
409    Thai,
410    /// Tagalog (tl)
411    #[serde(rename = "tl")]
412    Tagalog,
413    /// Turkish (tr)
414    #[serde(rename = "tr")]
415    Turkish,
416    /// Ukrainian (uk)
417    #[serde(rename = "uk")]
418    Ukrainian,
419    /// Vietnamese (vi)
420    #[serde(rename = "vi")]
421    Vietnamese,
422    /// ChineseSimplified (zh-CN)
423    #[serde(rename = "zh-CN")]
424    ChineseSimplified,
425    /// ChineseTraditional (zh-TW)
426    #[serde(rename = "zh-TW")]
427    ChineseTraditional,
428}
429
430/// Country Code Top-Level Domain
431/// From https://icannwiki.org/Country_code_top-level_domain
432#[derive(Clone, Copy, Debug, Serialize)]
433#[allow(dead_code)]
434pub enum Region {
435    /// AscensionIsland (.ac)
436    #[serde(rename = ".ac")]
437    AscensionIsland,
438    /// Andorra (.ad)
439    #[serde(rename = ".ad")]
440    Andorra,
441    /// UnitedArabEmirates (.ae)
442    #[serde(rename = ".ae")]
443    UnitedArabEmirates,
444    /// Afghanistan (.af)
445    #[serde(rename = ".af")]
446    Afghanistan,
447    /// AntiguaAndBarbuda (.ag)
448    #[serde(rename = ".ag")]
449    AntiguaAndBarbuda,
450    /// Anguilla (.ai)
451    #[serde(rename = ".ai")]
452    Anguilla,
453    /// Albania (.al)
454    #[serde(rename = ".al")]
455    Albania,
456    /// Armenia (.am)
457    #[serde(rename = ".am")]
458    Armenia,
459    /// AntillesNetherlands (.an)
460    #[serde(rename = ".an")]
461    AntillesNetherlands,
462    /// Angola (.ao)
463    #[serde(rename = ".ao")]
464    Angola,
465    /// Antarctica (.aq)
466    #[serde(rename = ".aq")]
467    Antarctica,
468    /// Argentina (.ar)
469    #[serde(rename = ".ar")]
470    Argentina,
471    /// AmericanSamoa (.as)
472    #[serde(rename = ".as")]
473    AmericanSamoa,
474    /// Austria (.at)
475    #[serde(rename = ".at")]
476    Austria,
477    /// Australia (.au)
478    #[serde(rename = ".au")]
479    Australia,
480    /// Aruba (.aw)
481    #[serde(rename = ".aw")]
482    Aruba,
483    /// AlandIslands (.ax)
484    #[serde(rename = ".ax")]
485    AlandIslands,
486    /// Azerbaijan (.az)
487    #[serde(rename = ".az")]
488    Azerbaijan,
489    /// BosniaAndHerzegovina (.ba)
490    #[serde(rename = ".ba")]
491    BosniaAndHerzegovina,
492    /// Barbados (.bb)
493    #[serde(rename = ".bb")]
494    Barbados,
495    /// Bangladesh (.bd)
496    #[serde(rename = ".bd")]
497    Bangladesh,
498    /// Belgium (.be)
499    #[serde(rename = ".be")]
500    Belgium,
501    /// BurkinaFaso (.bf)
502    #[serde(rename = ".bf")]
503    BurkinaFaso,
504    /// Bulgaria (.bg)
505    #[serde(rename = ".bg")]
506    Bulgaria,
507    /// Bahrain (.bh)
508    #[serde(rename = ".bh")]
509    Bahrain,
510    /// Burundi (.bi)
511    #[serde(rename = ".bi")]
512    Burundi,
513    /// Benin (.bj)
514    #[serde(rename = ".bj")]
515    Benin,
516    /// SaintBarthelemy (.bl)
517    #[serde(rename = ".bl")]
518    SaintBarthelemy,
519    /// Bermuda (.bm)
520    #[serde(rename = ".bm")]
521    Bermuda,
522    /// BruneiDarussalam (.bn)
523    #[serde(rename = ".bn")]
524    BruneiDarussalam,
525    /// Bolivia (.bo)
526    #[serde(rename = ".bo")]
527    Bolivia,
528    /// Bonaire (.bq)
529    #[serde(rename = ".bq")]
530    BonaireSintEustatiusAndSaba,
531    /// Brazil (.br)
532    #[serde(rename = ".br")]
533    Brazil,
534    /// Bahamas (.bs)
535    #[serde(rename = ".bs")]
536    Bahamas,
537    /// Bhutan (.bt)
538    #[serde(rename = ".bt")]
539    Bhutan,
540    /// BouvetIsland (.bv)
541    #[serde(rename = ".bv")]
542    BouvetIsland,
543    /// Botswana (.bw)
544    #[serde(rename = ".bw")]
545    Botswana,
546    /// Belarus (.by)
547    #[serde(rename = ".by")]
548    Belarus,
549    /// Belize (.bz)
550    #[serde(rename = ".bz")]
551    Belize,
552    /// Canada (.ca)
553    #[serde(rename = ".ca")]
554    Canada,
555    /// CocosIslands (.cc)
556    #[serde(rename = ".cc")]
557    CocosIslands,
558    /// DemocraticRepublicOfTheCongo (.cd)
559    #[serde(rename = ".cd")]
560    DemocraticRepublicOfTheCongo,
561    /// CentralAfricanRepublic (.cf)
562    #[serde(rename = ".cf")]
563    CentralAfricanRepublic,
564    /// RepublicOfCongo (.cg)
565    #[serde(rename = ".cg")]
566    RepublicOfCongo,
567    /// Switzerland (.ch)
568    #[serde(rename = ".ch")]
569    Switzerland,
570    /// CoteDivoire (.ci)
571    #[serde(rename = ".ci")]
572    CoteDivoire,
573    /// CookIslands (.ck)
574    #[serde(rename = ".ck")]
575    CookIslands,
576    /// Chile (.cl)
577    #[serde(rename = ".cl")]
578    Chile,
579    /// Cameroon (.cm)
580    #[serde(rename = ".cm")]
581    Cameroon,
582    /// China (.cn)
583    #[serde(rename = ".cn")]
584    China,
585    /// Colombia (.co)
586    #[serde(rename = ".co")]
587    Colombia,
588    /// CostaRica (.cr)
589    #[serde(rename = ".cr")]
590    CostaRica,
591    /// Cuba (.cu)
592    #[serde(rename = ".cu")]
593    Cuba,
594    /// CapeVerde (.cv)
595    #[serde(rename = ".cv")]
596    CapeVerde,
597    /// Curacao (.cw)
598    #[serde(rename = ".cw")]
599    Curacao,
600    /// ChristmasIsland (.cx)
601    #[serde(rename = ".cx")]
602    ChristmasIsland,
603    /// Cyprus (.cy)
604    #[serde(rename = ".cy")]
605    Cyprus,
606    /// CzechRepublic (.cz)
607    #[serde(rename = ".cz")]
608    CzechRepublic,
609    /// Germany (.de)
610    #[serde(rename = ".de")]
611    Germany,
612    /// Djibouti (.dj)
613    #[serde(rename = ".dj")]
614    Djibouti,
615    /// Denmark (.dk)
616    #[serde(rename = ".dk")]
617    Denmark,
618    /// Dominica (.dm)
619    #[serde(rename = ".dm")]
620    Dominica,
621    /// DominicanRepublic (.do)
622    #[serde(rename = ".do")]
623    DominicanRepublic,
624    /// Algeria (.dz)
625    #[serde(rename = ".dz")]
626    Algeria,
627    /// Ecuador (.ec)
628    #[serde(rename = ".ec")]
629    Ecuador,
630    /// Estonia (.ee)
631    #[serde(rename = ".ee")]
632    Estonia,
633    /// Egypt (.eg)
634    #[serde(rename = ".eg")]
635    Egypt,
636    /// WesternSahara (.eh)
637    #[serde(rename = ".eh")]
638    WesternSahara,
639    /// Eritrea (.er)
640    #[serde(rename = ".er")]
641    Eritrea,
642    /// Spain (.es)
643    #[serde(rename = ".es")]
644    Spain,
645    /// Ethiopia (.et)
646    #[serde(rename = ".et")]
647    Ethiopia,
648    /// EuropeanUnion (.eu)
649    #[serde(rename = ".eu")]
650    EuropeanUnion,
651    /// Finland (.fi)
652    #[serde(rename = ".fi")]
653    Finland,
654    /// Fiji (.fj)
655    #[serde(rename = ".fj")]
656    Fiji,
657    /// FalklandIslands (.fk)
658    #[serde(rename = ".fk")]
659    FalklandIslands,
660    /// FederatedStatesOfMicronesia (.fm)
661    #[serde(rename = ".fm")]
662    FederatedStatesOfMicronesia,
663    /// FaroeIslands (.fo)
664    #[serde(rename = ".fo")]
665    FaroeIslands,
666    /// France (.fr)
667    #[serde(rename = ".fr")]
668    France,
669    /// Gabon (.ga)
670    #[serde(rename = ".ga")]
671    Gabon,
672    /// Grenada (.gd)
673    #[serde(rename = ".gd")]
674    Grenada,
675    /// Georgia (.ge)
676    #[serde(rename = ".ge")]
677    Georgia,
678    /// FrenchGuiana (.gf)
679    #[serde(rename = ".gf")]
680    FrenchGuiana,
681    /// Guernsey (.gg)
682    #[serde(rename = ".gg")]
683    Guernsey,
684    /// Ghana (.gh)
685    #[serde(rename = ".gh")]
686    Ghana,
687    /// Gibraltar (.gi)
688    #[serde(rename = ".gi")]
689    Gibraltar,
690    /// Greenland (.gl)
691    #[serde(rename = ".gl")]
692    Greenland,
693    /// Gambia (.gm)
694    #[serde(rename = ".gm")]
695    Gambia,
696    /// Guinea (.gn)
697    #[serde(rename = ".gn")]
698    Guinea,
699    /// Guadeloupe (.gp)
700    #[serde(rename = ".gp")]
701    Guadeloupe,
702    /// EquatorialGuinea (.gq)
703    #[serde(rename = ".gq")]
704    EquatorialGuinea,
705    /// Greece (.gr)
706    #[serde(rename = ".gr")]
707    Greece,
708    /// SouthGeorgiaAndTheSouthSandwichIslands (.gs)
709    #[serde(rename = ".gs")]
710    SouthGeorgiaAndTheSouthSandwichIslands,
711    /// Guatemala (.gt)
712    #[serde(rename = ".gt")]
713    Guatemala,
714    /// Guam (.gu)
715    #[serde(rename = ".gu")]
716    Guam,
717    /// GuineaBissau (.gw)
718    #[serde(rename = ".gw")]
719    GuineaBissau,
720    /// Guyana (.gy)
721    #[serde(rename = ".gy")]
722    Guyana,
723    /// HongKong (.hk)
724    #[serde(rename = ".hk")]
725    HongKong,
726    /// HeardIslandAndMcDonaldIslands (.hm)
727    #[serde(rename = ".hm")]
728    HeardIslandAndMcDonaldIslands,
729    /// Honduras (.hn)
730    #[serde(rename = ".hn")]
731    Honduras,
732    /// Croatia (.hr)
733    #[serde(rename = ".hr")]
734    Croatia,
735    /// Haiti (.ht)
736    #[serde(rename = ".ht")]
737    Haiti,
738    /// Hungary (.hu)
739    #[serde(rename = ".hu")]
740    Hungary,
741    /// Indonesia (.id)
742    #[serde(rename = ".id")]
743    Indonesia,
744    /// Ireland (.ie)
745    #[serde(rename = ".ie")]
746    Ireland,
747    /// Israel (.il)
748    #[serde(rename = ".il")]
749    Israel,
750    /// IsleOfMan (.im)
751    #[serde(rename = ".im")]
752    IsleOfMan,
753    /// India (.in)
754    #[serde(rename = ".in")]
755    India,
756    /// BritishIndianOceanTerritory (.io)
757    #[serde(rename = ".io")]
758    BritishIndianOceanTerritory,
759    /// Iraq (.iq)
760    #[serde(rename = ".iq")]
761    Iraq,
762    /// IslamicRepublicOfIran (.ir)
763    #[serde(rename = ".ir")]
764    IslamicRepublicOfIran,
765    /// Iceland (.is)
766    #[serde(rename = ".is")]
767    Iceland,
768    /// Italy (.it)
769    #[serde(rename = ".it")]
770    Italy,
771    /// Jersey (.je)
772    #[serde(rename = ".je")]
773    Jersey,
774    /// Jamaica (.jm)
775    #[serde(rename = ".jm")]
776    Jamaica,
777    /// Jordan (.jo)
778    #[serde(rename = ".jo")]
779    Jordan,
780    /// Japan (.jp)
781    #[serde(rename = ".jp")]
782    Japan,
783    /// Kenya (.ke)
784    #[serde(rename = ".ke")]
785    Kenya,
786    /// Kyrgyzstan (.kg)
787    #[serde(rename = ".kg")]
788    Kyrgyzstan,
789    /// Cambodia (.kh)
790    #[serde(rename = ".kh")]
791    Cambodia,
792    /// Kiribati (.ki)
793    #[serde(rename = ".ki")]
794    Kiribati,
795    /// Comoros (.km)
796    #[serde(rename = ".km")]
797    Comoros,
798    /// SaintKittsAndNevis (.kn)
799    #[serde(rename = ".kn")]
800    SaintKittsAndNevis,
801    /// DemocraticPeoplesRepublicOfKorea (.kp)
802    #[serde(rename = ".kp")]
803    DemocraticPeoplesRepublicOfKorea,
804    /// RepublicOfKorea (.kp)
805    #[serde(rename = ".kp")]
806    RepublicOfKorea,
807    /// Kuwait (.kw)
808    #[serde(rename = ".kw")]
809    Kuwait,
810    /// CaymenIslands (.ky)
811    #[serde(rename = ".ky")]
812    CaymenIslands,
813    /// Kazakhstan (.kz)
814    #[serde(rename = ".kz")]
815    Kazakhstan,
816    /// Laos (.la)
817    #[serde(rename = ".la")]
818    Laos,
819    /// Lebanon (.lb)
820    #[serde(rename = ".lb")]
821    Lebanon,
822    /// SaintLucia (.lc)
823    #[serde(rename = ".lc")]
824    SaintLucia,
825    /// Liechtenstein (.li)
826    #[serde(rename = ".li")]
827    Liechtenstein,
828    /// SriLanka (.lk)
829    #[serde(rename = ".lk")]
830    SriLanka,
831    /// Liberia (.lr)
832    #[serde(rename = ".lr")]
833    Liberia,
834    /// Lesotho (.ls)
835    #[serde(rename = ".ls")]
836    Lesotho,
837    /// Lithuania (.lt)
838    #[serde(rename = ".lt")]
839    Lithuania,
840    /// Luxembourg (.lu)
841    #[serde(rename = ".lu")]
842    Luxembourg,
843    /// Latvia (.lv)
844    #[serde(rename = ".lv")]
845    Latvia,
846    /// Libya (.ly)
847    #[serde(rename = ".ly")]
848    Libya,
849    /// Morocco (.ma)
850    #[serde(rename = ".ma")]
851    Morocco,
852    /// Monaco (.mc)
853    #[serde(rename = ".mc")]
854    Monaco,
855    /// RepublicOfMoldova (.md)
856    #[serde(rename = ".md")]
857    RepublicOfMoldova,
858    /// Montenegro (.me)
859    #[serde(rename = ".me")]
860    Montenegro,
861    /// SaintMartin (.mf)
862    #[serde(rename = ".mf")]
863    SaintMartin,
864    /// Madagascar (.mg)
865    #[serde(rename = ".mg")]
866    Madagascar,
867    /// MarshallIslands (.mh)
868    #[serde(rename = ".mh")]
869    MarshallIslands,
870    /// Macedonia (.mk)
871    #[serde(rename = ".mk")]
872    Macedonia,
873    /// Mali (.ml)
874    #[serde(rename = ".ml")]
875    Mali,
876    /// Myanmar (.mm)
877    #[serde(rename = ".mm")]
878    Myanmar,
879    /// Mongolia (.mn)
880    #[serde(rename = ".mn")]
881    Mongolia,
882    /// Macao (.mo)
883    #[serde(rename = ".mo")]
884    Macao,
885    /// NorthernMarianaIslands (.mp)
886    #[serde(rename = ".mp")]
887    NorthernMarianaIslands,
888    /// Martinique (.mq)
889    #[serde(rename = ".mq")]
890    Martinique,
891    /// Mauritania (.mr)
892    #[serde(rename = ".mr")]
893    Mauritania,
894    /// Montserrat (.ms)
895    #[serde(rename = ".ms")]
896    Montserrat,
897    /// Malta (.mt)
898    #[serde(rename = ".mt")]
899    Malta,
900    /// Mauritius (.mu)
901    #[serde(rename = ".mu")]
902    Mauritius,
903    /// Maldives (.mv)
904    #[serde(rename = ".mv")]
905    Maldives,
906    /// Malawi (.mw)
907    #[serde(rename = ".mw")]
908    Malawi,
909    /// Mexico (.mx)
910    #[serde(rename = ".mx")]
911    Mexico,
912    /// Malaysia (.my)
913    #[serde(rename = ".my")]
914    Malaysia,
915    /// Mozambique (.mz)
916    #[serde(rename = ".mz")]
917    Mozambique,
918    /// Namibia (.na)
919    #[serde(rename = ".na")]
920    Namibia,
921    /// NewCaledonia (.nc)
922    #[serde(rename = ".nc")]
923    NewCaledonia,
924    /// Niger (.ne)
925    #[serde(rename = ".ne")]
926    Niger,
927    /// NorfolkIsland (.nf)
928    #[serde(rename = ".nf")]
929    NorfolkIsland,
930    /// Nigeria (.ng)
931    #[serde(rename = ".ng")]
932    Nigeria,
933    /// Nicaragua (.ni)
934    #[serde(rename = ".ni")]
935    Nicaragua,
936    /// Netherlands (.nl)
937    #[serde(rename = ".nl")]
938    Netherlands,
939    /// Norway (.no)
940    #[serde(rename = ".no")]
941    Norway,
942    /// Nepal (.np)
943    #[serde(rename = ".np")]
944    Nepal,
945    /// Nauru (.nr)
946    #[serde(rename = ".nr")]
947    Nauru,
948    /// Niue (.nu)
949    #[serde(rename = ".nu")]
950    Niue,
951    /// NewZealand (.nz)
952    #[serde(rename = ".nz")]
953    NewZealand,
954    /// Oman (.om)
955    #[serde(rename = ".om")]
956    Oman,
957    /// Panama (.pa)
958    #[serde(rename = ".pa")]
959    Panama,
960    /// Peru (.pe)
961    #[serde(rename = ".pe")]
962    Peru,
963    /// FrenchPolynesia (.pf)
964    #[serde(rename = ".pf")]
965    FrenchPolynesia,
966    /// PapuaNewGuinea (.pg)
967    #[serde(rename = ".pg")]
968    PapuaNewGuinea,
969    /// Philippines (.ph)
970    #[serde(rename = ".ph")]
971    Philippines,
972    /// Pakistan (.pk)
973    #[serde(rename = ".pk")]
974    Pakistan,
975    /// Poland (.pl)
976    #[serde(rename = ".pl")]
977    Poland,
978    /// SaintPierreAndMiquelon (.pm)
979    #[serde(rename = ".pm")]
980    SaintPierreAndMiquelon,
981    /// Pitcairn (.pn)
982    #[serde(rename = ".pn")]
983    Pitcairn,
984    /// PuertoRico (.pr)
985    #[serde(rename = ".pr")]
986    PuertoRico,
987    /// Palestine (.ps)
988    #[serde(rename = ".ps")]
989    Palestine,
990    /// Portugal (.pt)
991    #[serde(rename = ".pt")]
992    Portugal,
993    /// Palau (.pw)
994    #[serde(rename = ".pw")]
995    Palau,
996    /// Paraguay (.py)
997    #[serde(rename = ".py")]
998    Paraguay,
999    /// Qatar (.qa)
1000    #[serde(rename = ".qa")]
1001    Qatar,
1002    /// Reunion (.re)
1003    #[serde(rename = ".re")]
1004    Reunion,
1005    /// Romania (.ro)
1006    #[serde(rename = ".ro")]
1007    Romania,
1008    /// Serbia (.rs)
1009    #[serde(rename = ".rs")]
1010    Serbia,
1011    /// Russia (.ru)
1012    #[serde(rename = ".ru")]
1013    Russia,
1014    /// Rwanda (.rw)
1015    #[serde(rename = ".rw")]
1016    Rwanda,
1017    /// SaudiArabia (.sa)
1018    #[serde(rename = ".sa")]
1019    SaudiArabia,
1020    /// SolomonIslands (.sb)
1021    #[serde(rename = ".sb")]
1022    SolomonIslands,
1023    /// Seychelles (.sc)
1024    #[serde(rename = ".sc")]
1025    Seychelles,
1026    /// Sudan (.sd)
1027    #[serde(rename = ".sd")]
1028    Sudan,
1029    /// Sweden (.se)
1030    #[serde(rename = ".se")]
1031    Sweden,
1032    /// Singapore (.sg)
1033    #[serde(rename = ".sg")]
1034    Singapore,
1035    /// SaintHelena (.sh)
1036    #[serde(rename = ".sh")]
1037    SaintHelena,
1038    /// Slovenia (.si)
1039    #[serde(rename = ".si")]
1040    Slovenia,
1041    /// SvalbardAndJanMayen (.sj)
1042    #[serde(rename = ".sj")]
1043    SvalbardAndJanMayen,
1044    /// Slovakia (.sk)
1045    #[serde(rename = ".sk")]
1046    Slovakia,
1047    /// SierraLeone (.sl)
1048    #[serde(rename = ".sl")]
1049    SierraLeone,
1050    /// SanMarino (.sm)
1051    #[serde(rename = ".sm")]
1052    SanMarino,
1053    /// Senegal (.sn)
1054    #[serde(rename = ".sn")]
1055    Senegal,
1056    /// Somalia (.so)
1057    #[serde(rename = ".so")]
1058    Somalia,
1059    /// Suriname (.sr)
1060    #[serde(rename = ".sr")]
1061    Suriname,
1062    /// SouthSudan (.ss)
1063    #[serde(rename = ".ss")]
1064    SouthSudan,
1065    /// SaoTomeAndPrincipe (.st)
1066    #[serde(rename = ".st")]
1067    SaoTomeAndPrincipe,
1068    /// SovietUnion (.su)
1069    #[serde(rename = ".su")]
1070    SovietUnion,
1071    /// ElSalvador (.sv)
1072    #[serde(rename = ".sv")]
1073    ElSalvador,
1074    /// SintMaarten (.sx)
1075    #[serde(rename = ".sx")]
1076    SintMaarten,
1077    /// Syria (.sy)
1078    #[serde(rename = ".sy")]
1079    Syria,
1080    /// Swaziland (.sz)
1081    #[serde(rename = ".sz")]
1082    Swaziland,
1083    /// TurksAndCaicosIslands (.tc)
1084    #[serde(rename = ".tc")]
1085    TurksAndCaicosIslands,
1086    /// Chad (.td)
1087    #[serde(rename = ".td")]
1088    Chad,
1089    /// FrenchSouthernTerritories (.tf)
1090    #[serde(rename = ".tf")]
1091    FrenchSouthernTerritories,
1092    /// Togo (.tg)
1093    #[serde(rename = ".tg")]
1094    Togo,
1095    /// Thailand (.th)
1096    #[serde(rename = ".th")]
1097    Thailand,
1098    /// Tajikistan (.tj)
1099    #[serde(rename = ".tj")]
1100    Tajikistan,
1101    /// Tokelau (.tk)
1102    #[serde(rename = ".tk")]
1103    Tokelau,
1104    /// TimorLeste (.tl)
1105    #[serde(rename = ".tl")]
1106    TimorLeste,
1107    /// Turkmenistan (.tm)
1108    #[serde(rename = ".tm")]
1109    Turkmenistan,
1110    /// Tunisia (.tn)
1111    #[serde(rename = ".tn")]
1112    Tunisia,
1113    /// Tonga (.to)
1114    #[serde(rename = ".to")]
1115    Tonga,
1116    /// PortugueseTimor (.tp)
1117    #[serde(rename = ".tp")]
1118    PortugueseTimor,
1119    /// Turkey (.tr)
1120    #[serde(rename = ".tr")]
1121    Turkey,
1122    /// TrinidadAndTobago (.tt)
1123    #[serde(rename = ".tt")]
1124    TrinidadAndTobago,
1125    /// Tuvalu (.tv)
1126    #[serde(rename = ".tv")]
1127    Tuvalu,
1128    /// Taiwan (.tw)
1129    #[serde(rename = ".tw")]
1130    Taiwan,
1131    /// Tanzania (.tz)
1132    #[serde(rename = ".tz")]
1133    Tanzania,
1134    /// Ukraine (.ua)
1135    #[serde(rename = ".ua")]
1136    Ukraine,
1137    /// Uganda (.ug)
1138    #[serde(rename = ".ug")]
1139    Uganda,
1140    /// UnitedKingdom (.uk)
1141    #[serde(rename = ".uk")]
1142    UnitedKingdom,
1143    /// UnitedStatesMinorOutlyingIslands (.um)
1144    #[serde(rename = ".um")]
1145    UnitedStatesMinorOutlyingIslands,
1146    /// UnitedStates (.us)
1147    #[serde(rename = ".us")]
1148    UnitedStates,
1149    /// Uruguay (.uy)
1150    #[serde(rename = ".uy")]
1151    Uruguay,
1152    /// Uzbekistan (.uz)
1153    #[serde(rename = ".uz")]
1154    Uzbekistan,
1155    /// VaticanCity (.va)
1156    #[serde(rename = ".va")]
1157    VaticanCity,
1158    /// SaintVincentAndTheGrenadines (.vc)
1159    #[serde(rename = ".vc")]
1160    SaintVincentAndTheGrenadines,
1161    /// Venezuela (.ve)
1162    #[serde(rename = ".ve")]
1163    Venezuela,
1164    /// BritishVirginIslands (.vg)
1165    #[serde(rename = ".vg")]
1166    BritishVirginIslands,
1167    /// USVirginIslands (.vi)
1168    #[serde(rename = ".vi")]
1169    USVirginIslands,
1170    /// Vietnam (.vn)
1171    #[serde(rename = ".vn")]
1172    Vietnam,
1173    /// Vanuatu (.vu)
1174    #[serde(rename = ".vu")]
1175    Vanuatu,
1176    /// WallisAndFutuna (.wf)
1177    #[serde(rename = ".wf")]
1178    WallisAndFutuna,
1179    /// Samoa (.ws)
1180    #[serde(rename = ".ws")]
1181    Samoa,
1182    /// Mayote (.yt)
1183    #[serde(rename = ".yt")]
1184    Mayote,
1185    /// SouthAfrica (.za)
1186    #[serde(rename = ".za")]
1187    SouthAfrica,
1188    /// Zambia (.zm)
1189    #[serde(rename = ".zm")]
1190    Zambia,
1191    /// Zimbabwe (.zw)
1192    #[serde(rename = ".zw")]
1193    Zimbabwe,
1194}
1195
1196/// WGS-84 coordinates that support serializing and deserializing
1197#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
1198pub struct Coordinates {
1199    pub lat: f64,
1200    pub lng: f64,
1201}
1202
1203/// A unique identifier that can be used with other Google APIs.
1204/// For example, you can use the place_id in a Places SDK request to get details of a local business, such as phone number, opening hours, user reviews, and more. See the place ID overview.
1205#[derive(Debug, Clone, Deserialize, Eq, Hash, PartialEq, Serialize)]
1206pub struct PlaceId(String);