use crate::config_struct;
use crate::patterns::{merge_iter, merge_plugin_partials};
use moon_common::Id;
use rustc_hash::FxHashMap;
use schematic::{Config, validate};
use serde_json::Value;
use warpgate_api::PluginLocator;
config_struct!(
#[derive(Config)]
#[config(allow_unknown_fields)]
pub struct ExtensionPluginConfig {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub plugin: Option<PluginLocator>,
#[setting(flatten, merge = merge_iter)]
pub config: FxHashMap<String, serde_json::Value>,
}
);
impl ExtensionPluginConfig {
pub fn get_plugin_locator(&self) -> &PluginLocator {
self.plugin.as_ref().unwrap()
}
pub fn to_json(&self) -> Value {
Value::Object(self.config.clone().into_iter().collect())
}
}
config_struct!(
#[derive(Config)]
#[config(allow_unknown_fields)]
pub struct ExtensionsConfig {
#[setting(default = "./cache/schemas/extensions.json", rename = "$schema")]
pub schema: String,
#[setting(extend, validate = validate::extends_from)]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub extends: Option<schematic::ExtendsFrom>,
#[setting(flatten, nested, merge = merge_plugin_partials)]
pub plugins: FxHashMap<Id, ExtensionPluginConfig>,
}
);
impl ExtensionsConfig {
pub fn get_plugin_config(&self, id: impl AsRef<str>) -> Option<&ExtensionPluginConfig> {
self.plugins.get(id.as_ref())
}
pub fn should_invalidate(&self, other: &Self) -> bool {
self.plugins != other.plugins
}
}