1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
use crate::file_reader::FgbReader; use crate::http_reader::HttpFgbReader; use async_trait::async_trait; use geozero::error::Result; use geozero::{FeatureProcessor, HttpReader, OpenOpts, ReadSeek, Reader, SelectOpts}; pub struct Driver<'a>(FgbReader<'a>); impl<'a> Reader<'a> for Driver<'a> { fn open<R: 'a + ReadSeek>(reader: &'a mut R, _opts: &OpenOpts) -> Result<Self> { Ok(Driver { 0: FgbReader::open(reader)?, }) } fn select(&mut self, opts: &SelectOpts) -> Result<()> { if let Some(bbox) = &opts.extent { self.0 .select_bbox(bbox.minx, bbox.miny, bbox.maxx, bbox.maxy)?; } else { self.0.select_all()?; } Ok(()) } fn process<P: FeatureProcessor>(&mut self, processor: &mut P) -> Result<()> { self.0.process_features(processor) } } pub struct HttpDriver(HttpFgbReader); #[async_trait] impl HttpReader for HttpDriver { async fn open(url: String, _opts: &OpenOpts) -> Result<Self> { Ok(HttpDriver { 0: HttpFgbReader::open(&url).await?, }) } async fn select(&mut self, opts: &SelectOpts) -> Result<()> { if let Some(bbox) = &opts.extent { self.0 .select_bbox(bbox.minx, bbox.miny, bbox.maxx, bbox.maxy) .await?; } else { self.0.select_all().await?; } Ok(()) } async fn process<P: FeatureProcessor + Send>(&mut self, processor: &mut P) -> Result<()> { self.0.process_features(processor).await?; Ok(()) } }