spacegate_config/service/fs/
retrieve.rs

1use spacegate_model::{PluginConfig, PluginInstanceId};
2
3use super::Fs;
4use crate::service::config_format::ConfigFormat;
5use crate::BoxError;
6use crate::{model::gateway::SgGateway, model::http_route::SgHttpRoute};
7
8use crate::service::Retrieve;
9
10impl<F> Retrieve for Fs<F>
11where
12    F: ConfigFormat + Send + Sync,
13{
14    async fn retrieve_all_plugins(&self) -> Result<Vec<PluginConfig>, BoxError> {
15        self.retrieve_cached(|cfg| cfg.plugins.clone().into_config_vec()).await
16    }
17
18    async fn retrieve_plugin(&self, id: &PluginInstanceId) -> Result<Option<PluginConfig>, BoxError> {
19        self.retrieve_cached(|cfg| cfg.plugins.get(id).cloned().map(|spec| PluginConfig { spec, id: id.clone() })).await
20    }
21
22    async fn retrieve_config_item_gateway(&self, gateway_name: &str) -> Result<Option<SgGateway>, BoxError> {
23        self.retrieve_cached(|cfg| cfg.gateways.get(gateway_name).map(|item| item.gateway.clone())).await
24    }
25
26    async fn retrieve_config_item_route(&self, gateway_name: &str, route_name: &str) -> Result<Option<SgHttpRoute>, BoxError> {
27        self.retrieve_cached(|cfg| cfg.gateways.get(gateway_name).and_then(|item| item.routes.get(route_name)).cloned()).await
28    }
29
30    async fn retrieve_config_item_route_names(&self, name: &str) -> Result<Vec<String>, BoxError> {
31        self.retrieve_cached(|cfg| cfg.gateways.get(name).map(|item| item.routes.keys().cloned().collect()).unwrap_or_default()).await
32    }
33
34    async fn retrieve_config_names(&self) -> Result<Vec<String>, BoxError> {
35        self.retrieve_cached(|cfg| cfg.gateways.keys().cloned().collect()).await
36    }
37
38    async fn retrieve_config(&self) -> Result<spacegate_model::Config, BoxError> {
39        self.retrieve_cached(Clone::clone).await
40    }
41
42    async fn retrieve_plugins_by_code(&self, code: &str) -> Result<Vec<PluginConfig>, BoxError> {
43        self.retrieve_cached(|cfg| {
44            cfg.plugins
45                .iter()
46                .filter_map(|(id, spec)| {
47                    (id.code == code).then_some(PluginConfig {
48                        spec: spec.clone(),
49                        id: id.clone(),
50                    })
51                })
52                .collect()
53        })
54        .await
55    }
56}