bbox_asset_server/
service.rs1use 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 AssetService { plugins_index }
40 }
41 fn metrics(&self) -> &'static Self::Metrics {
42 no_metrics()
43 }
44}