use coord::TileCoord; use std::path::PathBuf; use url_template::UrlTemplate; #[derive(Debug)] pub struct TileSource { id: u32, url_template: UrlTemplate, directory: PathBuf, extension: String, min_zoom: u32, max_zoom: u32, } #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] pub struct TileSourceId { id: u32, } impl TileSource { pub fn new, P: Into>( id: u32, url_template: S, directory: P, extension: String, min_zoom: u32, max_zoom: u32, ) -> Result { Ok(TileSource { id, url_template: UrlTemplate::new(url_template)?, directory: directory.into(), extension, min_zoom, max_zoom, }) } pub fn id(&self) -> TileSourceId { TileSourceId { id: self.id, } } pub fn local_tile_path(&self, tile_coord: TileCoord) -> PathBuf { let mut path = PathBuf::from(&self.directory); path.push(tile_coord.zoom.to_string()); path.push(tile_coord.x.to_string()); path.push(tile_coord.y.to_string() + "." + &self.extension); path } pub fn remote_tile_url(&self, tile_coord: TileCoord) -> Option { self.url_template.fill(tile_coord) } pub fn min_tile_zoom(&self) -> u32 { self.min_zoom } pub fn max_tile_zoom(&self) -> u32 { self.max_zoom } }