use crate::{Coordinate, CoordinateError};
use serde::Deserialize;
#[derive(Deserialize)]
struct OSMLocation {
lat: String,
lon: String,
}
pub fn resolve_sync(location: &str) -> Result<Coordinate, CoordinateError> {
let locations = reqwest::blocking::Client::new()
.get("https://nominatim.openstreetmap.org/search")
.header(reqwest::header::USER_AGENT, "tanker_price")
.query(&[("format", "json"), ("q", location)])
.send()?
.json::<Vec<OSMLocation>>()?;
if let Some(location) = locations.get(0) {
Ok(Coordinate {
lng: location.lon.parse()?,
lat: location.lat.parse()?,
})
} else {
Err(CoordinateError::Unresolveable)
}
}
pub async fn resolve(location: &str) -> Result<Coordinate, CoordinateError> {
let locations = reqwest::Client::new()
.get("https://nominatim.openstreetmap.org/search")
.header(reqwest::header::USER_AGENT, "tanker_price")
.query(&[("format", "json"), ("q", location)])
.send()
.await?
.json::<Vec<OSMLocation>>()
.await?;
if let Some(location) = locations.get(0) {
Ok(Coordinate {
lng: location.lon.parse()?,
lat: location.lat.parse()?,
})
} else {
Err(CoordinateError::Unresolveable)
}
}