use crate::tile_cache::tile_name_conversion::TileSpecification;
use bytes::Bytes;
const TEST_IMAGE: &[u8] = include_bytes!("../../assets/Test.png");
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum RequesterError {
InvalidUserAgent(String),
HttpClient(String),
}
pub struct Requester {
client: Option<reqwest::Client>,
intro_url: String,
post_url: String,
}
impl Requester {
pub fn new(intro_url: &str, post_url: &str, user_agent: &str) -> Result<Self, RequesterError> {
let user_agent_value = reqwest::header::HeaderValue::from_str(user_agent)
.map_err(|_| RequesterError::InvalidUserAgent(user_agent.to_string()))?;
let client = reqwest::Client::builder()
.default_headers(
[(reqwest::header::USER_AGENT, user_agent_value)]
.into_iter()
.collect(),
)
.build()
.map_err(|e| RequesterError::HttpClient(e.to_string()))?;
Ok(Self {
client: Some(client),
intro_url: intro_url.to_string(),
post_url: post_url.to_string(),
})
}
pub fn dummy() -> Self {
Self {
client: None,
intro_url: String::new(),
post_url: String::new(),
}
}
pub async fn get_image_data(&self, specification: TileSpecification) -> Result<Bytes, String> {
if let Some(client) = &self.client {
let final_url = self.intro_url.clone()
+ specification.get_partial_url().as_str()
+ self.post_url.as_str();
Ok(client
.get(final_url)
.send()
.await
.map_err(|x| x.to_string())?
.error_for_status()
.map_err(|x| x.to_string())?
.bytes()
.await
.map_err(|x| x.to_string())?)
} else {
Ok(Bytes::from_static(TEST_IMAGE))
}
}
}
#[cfg(test)]
mod tests {
use super::super::tile_name_conversion::*;
use super::*;
#[tokio::test]
async fn dummy_requester() {
let dummy = Requester::dummy();
assert_eq!(
dummy
.get_image_data(TileSpecification::new(0, 0, 0))
.await
.unwrap(),
TEST_IMAGE.to_vec()
);
}
#[ignore]
#[tokio::test]
async fn real_requester() {
let requester =
Requester::new("https://tile.openstreetmap.org/", "", "test_runner").unwrap();
let data = requester
.get_image_data(TileSpecification::new(0, 0, 0))
.await
.unwrap();
assert!(
!data.is_empty(),
"We should have gotten some data from OSM."
);
}
}