use martin_core::tiles::BoxedSource;
use martin_core::tiles::cog::CogSource;
use crate::TileSourceManager;
use crate::config::file::cog::CogConfig;
use crate::config::file::process::ProcessConfig;
use crate::config::file::tiles::discovery::{FsDiscovery, FsSourceBuilder};
use crate::config::file::tiles::driver::{Baseline, NotifyTrigger, ReloadDriver};
use crate::config::file::{FileConfigEnum, SourceBuildResult, TileSourceWarning};
use crate::config::primitives::IdResolver;
use crate::reload::FileKind;
pub struct CogReloader {
driver: ReloadDriver<FsDiscovery, TileSourceManager>,
}
impl CogReloader {
#[must_use]
pub fn new(
tsm: TileSourceManager,
id_resolver: IdResolver,
config: &FileConfigEnum<CogConfig>,
) -> Self {
let build: FsSourceBuilder = Box::new(|id, path, policy| {
Box::pin(async move {
let src = CogSource::new(id, path, policy.zoom())?;
Ok(Box::new(src) as BoxedSource)
})
});
let discovery = FsDiscovery::from_config(
FileKind::Cog,
config,
&["tif", "tiff"],
id_resolver,
&ProcessConfig::default(),
build,
);
Self {
driver: ReloadDriver::new(discovery, tsm),
}
}
pub async fn init(&mut self) -> SourceBuildResult<Vec<TileSourceWarning>> {
self.driver.init().await
}
pub fn start(self) -> notify::Result<()> {
let directories = self.driver.discovery().directories();
if directories.is_empty() {
return Ok(());
}
let trigger = NotifyTrigger::new(&directories)?;
self.driver.spawn(trigger, Baseline::Initialized);
Ok(())
}
}