use crate::common::*;
use crate::error::{Error, Result};
use crate::{auth, links};
use super::PlaceQuery;
use super::*;
pub async fn show(id: &str, token: &auth::Token) -> Result<Response<Place>> {
let url = format!("{}/{}.json", links::place::SHOW_STEM, id);
let req = get(&url, token, None);
request_with_json_response(req).await
}
pub fn reverse_geocode(latitude: f64, longitude: f64) -> GeocodeBuilder {
GeocodeBuilder::new(latitude, longitude)
}
fn parse_url(base: &'static str, full: &str) -> Result<ParamList> {
let mut iter = full.split('?');
if let Some(base_part) = iter.next() {
if base_part != base {
return Err(Error::BadUrl);
}
} else {
return Err(Error::BadUrl);
}
if let Some(list) = iter.next() {
list.split('&').try_fold(ParamList::new(), |p, pair| {
let mut kv_iter = pair.split('=');
let k = kv_iter.next().ok_or(Error::BadUrl)?;
let v = kv_iter.next().ok_or(Error::BadUrl)?;
Ok(p.add_param(k.to_string(), v.to_string()))
})
} else {
Err(Error::BadUrl)
}
}
pub async fn reverse_geocode_url(url: &str, token: &auth::Token) -> Result<Response<SearchResult>> {
let params = parse_url(links::place::REVERSE_GEOCODE, url)?;
let req = get(links::place::REVERSE_GEOCODE, token, Some(¶ms));
request_with_json_response(req).await
}
pub fn search_point(latitude: f64, longitude: f64) -> SearchBuilder {
SearchBuilder::new(PlaceQuery::LatLon(latitude, longitude))
}
pub fn search_query(query: impl Into<CowStr>) -> SearchBuilder {
SearchBuilder::new(PlaceQuery::Query(query.into()))
}
pub fn search_ip(query: impl Into<CowStr>) -> SearchBuilder {
SearchBuilder::new(PlaceQuery::IPAddress(query.into()))
}
pub async fn search_url(url: &str, token: &auth::Token) -> Result<Response<SearchResult>> {
let params = parse_url(links::place::SEARCH, url)?;
let req = get(links::place::REVERSE_GEOCODE, token, Some(¶ms));
request_with_json_response(req).await
}