pub mod directions_distance;
pub mod directions_duration;
pub mod driving_maneuver;
pub mod geocoded_waypoint;
pub mod geocoder_status;
pub mod leg;
pub mod overview_polyline;
pub mod polyline;
pub mod route;
pub mod status;
pub mod step;
pub mod transit_agency;
pub mod transit_currency;
pub mod transit_details;
pub mod transit_fare;
pub mod transit_line;
pub mod transit_stop;
pub mod transit_time;
pub mod transit_vehicle;
use crate::directions::{
Error,
response::{
geocoded_waypoint::GeocodedWaypoint,
route::Route,
status::Status
},
travel_mode::TravelMode,
};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct Response {
#[serde(default)]
pub available_travel_modes: Vec<TravelMode>,
#[serde(default)]
pub error_message: Option<String>,
#[serde(default)]
pub geocoded_waypoints: Vec<GeocodedWaypoint>,
#[serde(default)]
pub routes: Vec<Route>,
pub status: Status,
}
impl std::convert::TryFrom<String> for Response {
type Error = serde_json::Error;
fn try_from(s: String) -> Result<Self, Self::Error> {
serde_json::from_slice(&s.into_bytes())
} }
impl std::str::FromStr for Response {
type Err = serde_json::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let bytes = s.to_string().into_bytes();
serde_json::from_slice(&bytes)
} }
impl std::convert::From<Response> for Result<Response, crate::directions::Error> {
fn from(response: Response) -> Self {
match response.status {
Status::Ok => Ok(response),
Status::InvalidRequest => Err(Error::InvalidRequest),
Status::MaxRouteLengthExceeded => Err(Error::MaxRouteLengthExceeded),
Status::MaxWaypointsExceeded => Err(Error::MaxWaypointsExceeded),
Status::NotFound => Err(Error::NotFound),
Status::OverDailyLimit => Err(Error::OverDailyLimit),
Status::OverQueryLimit => Err(Error::OverQueryLimit),
Status::RequestDenied => Err(Error::RequestDenied),
Status::UnknownError => Err(Error::UnknownError),
Status::ZeroResults => Err(Error::ZeroResults),
} } }