bbox_tile_server/datasource/
pmtiles.rs

1//! PMTiles tile source.
2
3use crate::datasource::{
4    wms_fcgi::HttpRequestParams, LayerInfo, SourceType, TileResponse, TileSource, TileSourceError,
5};
6use crate::filter_params::FilterParams;
7use crate::store::pmtiles::PmtilesStoreReader;
8use crate::store::TileReader;
9use async_trait::async_trait;
10use bbox_core::Format;
11use log::debug;
12use tile_grid::{Tms, Xyz};
13use tilejson::tilejson;
14use tilejson::TileJSON;
15
16#[async_trait]
17impl TileSource for PmtilesStoreReader {
18    async fn xyz_request(
19        &self,
20        _tms: &Tms,
21        tile: &Xyz,
22        _filter: &FilterParams,
23        _format: &Format,
24        _request_params: HttpRequestParams<'_>,
25    ) -> Result<TileResponse, TileSourceError> {
26        if let Some(tile) = self
27            .get_tile(tile)
28            .await
29            .map_err(|_| TileSourceError::TileXyzError)?
30        {
31            Ok(tile)
32        } else {
33            Err(TileSourceError::TileXyzError) // TODO: check for empty tile?
34        }
35    }
36    fn source_type(&self) -> SourceType {
37        SourceType::Vector //TODO
38    }
39    async fn tilejson(&self, _tms: &Tms, format: &Format) -> Result<TileJSON, TileSourceError> {
40        debug!(
41            "Metadata {}: {}",
42            self.path.display(),
43            self.get_metadata().await?
44        );
45        let mut tj = tilejson! { tiles: vec![] };
46        tj.other
47            .insert("format".to_string(), format.file_suffix().into());
48        Ok(tj)
49    }
50    async fn layers(&self) -> Result<Vec<LayerInfo>, TileSourceError> {
51        Ok(vec![LayerInfo {
52            name: self.path.to_string_lossy().to_string(), // TODO: file name only
53            geometry_type: None,
54            style: None,
55        }])
56    }
57}