use crate::roads::{
Error,
error_response::ErrorResponse,
snapped_point::SnappedPoint,
Status,
};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
pub struct Response {
#[serde(rename = "snappedPoints")]
#[serde(alias = "snapped_points")]
#[serde(default)]
pub snapped_points: Vec<SnappedPoint>,
#[serde(rename = "warningMessage")]
#[serde(alias = "warning_message")]
#[serde(default)]
pub warning_message: Option<String>,
#[serde(default)]
pub error: Option<ErrorResponse>,
}
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, Error> {
fn from(response: Response) -> Self {
match response.error {
None => Ok(response),
Some(error_response) => match error_response.status {
Status::InvalidArgument => Err(Error::InvalidArgument(error_response.message)),
Status::PermissionDenied => Err(Error::PermissionDenied(error_response.message)),
Status::NotFound => Err(Error::NotFound(error_response.message)),
Status::ResourceExhausted => Err(Error::ResourceExhausted(error_response.message)),
}, } } }