Skip to main content

bbox_asset_server/
service.rs

1use crate::config::AssetServiceCfg;
2use crate::qgis_plugins::plugin_files;
3use async_trait::async_trait;
4use bbox_core::cli::{NoArgs, NoCommands};
5use bbox_core::config::{app_dir, CoreServiceCfg};
6use bbox_core::metrics::{no_metrics, NoMetrics};
7use bbox_core::service::OgcApiService;
8use log::{info, warn};
9use std::collections::HashMap;
10use std::path::{Path, PathBuf};
11
12pub type PluginIndex = HashMap<String, Vec<PathBuf>>;
13
14#[derive(Clone)]
15pub struct AssetService {
16    pub plugins_index: PluginIndex,
17}
18
19#[async_trait]
20impl OgcApiService for AssetService {
21    type Config = AssetServiceCfg;
22    type CliCommands = NoCommands;
23    type CliArgs = NoArgs;
24    type Metrics = NoMetrics;
25
26    async fn create(service_cfg: &Self::Config, _core_cfg: &CoreServiceCfg) -> Self {
27        let mut plugins_index = PluginIndex::new();
28        for repo in &service_cfg.repo {
29            let dir = app_dir(&repo.dir).to_string_lossy().to_string();
30            if Path::new(&dir).is_dir() {
31                info!("Scanning QGIS plugin repository directory '{dir}'");
32                let plugins = plugin_files(&dir);
33                plugins_index.insert(format!("{}/plugins.xml", repo.path), plugins);
34            } else {
35                warn!("QGIS plugin repository file directory '{dir}' not found");
36            }
37        }
38        // static and template dir config is processed in register_endpoints
39        AssetService { plugins_index }
40    }
41    fn metrics(&self) -> &'static Self::Metrics {
42        no_metrics()
43    }
44}