use crate::places::place_autocomplete::response::status::Status;
use miette::Diagnostic;
use thiserror::Error;
#[derive(Debug, Diagnostic, Error)]
#[diagnostic(code(google_maps::place_autocomplete::error), url(docsrs))]
pub enum Error {
GoogleMapsService(Status, Option<String>),
HttpUnsuccessful(String),
InvalidStatusCode(String),
InvalidAutocompleteType(String),
QueryNotBuilt,
#[cfg(feature = "enable-reqwest")]
Reqwest(crate::ReqError),
#[cfg(feature = "enable-reqwest")]
ReqwestMessage(String),
SerdeJson(serde_json::error::Error),
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
Self::GoogleMapsService(status, error_message) => match error_message {
Some(error_message) => write!(f, "Google Maps Places API service: {error_message}"),
None => match status {
Status::InvalidRequest => write!(f, "Google Maps Places API service: \
Invalid request. \
The request was malformed."),
Status::Ok => write!(f, "Google Maps Time Zone service: \
Ok. \
The request was successful."),
Status::OverQueryLimit => write!(f, "Google Maps Places API service: \
Over query limit. \
Requestor has exceeded quota."),
Status::RequestDenied => write!(f, "Google Maps Places API service: \
Request denied \
Service did not complete the request."),
Status::UnknownError => write!(f, "Google Maps Places API service: \
Unknown error."),
Status::ZeroResults => write!(f, "Google Maps Places API service: \
Zero results. \
This may occur if the geocoder was passed a non-existent address."),
} }, Self::HttpUnsuccessful(status) => write!(f,
"Google Maps Places API client: \
Could not successfully query the Google Cloud Platform service. \
The service last responded with a `{status}` status."),
Self::InvalidStatusCode(status_code) => write!(f, "Google Maps Places API client: \
`{status_code}` is not a valid status code. \
Valid codes are `INVALID_REQUEST`, `OK`, `OVER_DAILY_LIMIT`, \
`OVER_QUERY_LIMIT`, `REQUEST_DENIED`, `UNKNOWN_ERROR`, and \
`ZERO_RESULTS`."),
Self::InvalidAutocompleteType(autocomplete_type) => write!(f, "Google Maps Places API client: \
`{autocomplete_type}` is not a valid autocomplete type. \
Valid types are `geocode`, `address`, `establishment`, \
`(regions)`, `(cities)`."),
Self::QueryNotBuilt => write!(f, "Google Maps Places API client library: \
The query string must be built before the request may be sent to the Google Cloud Maps Platform. \
Ensure the build() method is called before run()."),
#[cfg(feature = "enable-reqwest")]
Self::Reqwest(error) => write!(f, "Google Maps Places API client in the Reqwest library: {error}"),
#[cfg(feature = "enable-reqwest")]
Self::ReqwestMessage(error) => write!(f, "Google Maps Geocoding API client in the Reqwest library: {error}"),
Self::SerdeJson(error) => write!(f, "Google Maps Places API client in the Serde JSON library: {error}"),
} } }
#[cfg(feature = "enable-reqwest")]
impl From<reqwest::Error> for Error {
fn from(error: reqwest::Error) -> Self {
Self::Reqwest(crate::ReqError::from(error))
} }
impl From<serde_json::error::Error> for Error {
fn from(error: serde_json::error::Error) -> Self {
Self::SerdeJson(error)
} }