use crate::places::{Error, Place, status::Status};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
pub struct Response {
#[serde(default)]
pub html_attributions: Vec<String>,
#[serde(default)]
pub result: Option<Place>,
pub status: Status,
#[serde(default)]
pub info_messages: Vec<String>,
}
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::places::Error> {
fn from(response: Response) -> Self {
match response.status {
Status::Ok => Ok(response),
Status::InvalidRequest => Err(Error::InvalidRequest),
Status::OverQueryLimit => Err(Error::OverQueryLimit),
Status::RequestDenied => Err(Error::RequestDenied),
Status::UnknownError => Err(Error::UnknownError),
Status::ZeroResults => Err(Error::ZeroResults),
Status::NotFound => Err(Error::NotFound),
} } }