use super::{PluginIdentity, PluginProposalPolicy};
use crate::plugin::{CURRENT_WIT_WORLD, PluginCapabilities, PluginManifest, PluginRuntimeLimits};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(default, deny_unknown_fields)]
pub struct PluginConfig {
pub identity: String,
pub component_path: PathBuf,
pub wit_world: String,
pub enabled: bool,
pub capabilities: PluginCapabilities,
pub runtime_limits: PluginRuntimeLimits,
pub proposal_policy: PluginProposalPolicy,
}
impl PluginConfig {
#[must_use]
pub fn supports_current_world(&self) -> bool {
self.wit_world == CURRENT_WIT_WORLD
}
#[must_use]
pub fn granted_manifest_capabilities(&self, manifest: &PluginManifest) -> PluginCapabilities {
let Ok(config_identity) = PluginIdentity::try_new(self.identity.clone()) else {
return PluginCapabilities::default();
};
let Ok(manifest_identity) = PluginIdentity::try_new(manifest.identity().to_owned()) else {
return PluginCapabilities::default();
};
if !self.enabled
|| config_identity != manifest_identity
|| self.wit_world != manifest.wit_world()
|| self.wit_world != CURRENT_WIT_WORLD
{
return PluginCapabilities::default();
}
self.capabilities
.intersection(manifest.requested_capabilities())
}
}
impl Default for PluginConfig {
fn default() -> Self {
Self {
identity: String::new(),
component_path: PathBuf::new(),
wit_world: String::from(CURRENT_WIT_WORLD),
enabled: false,
capabilities: PluginCapabilities::default(),
runtime_limits: PluginRuntimeLimits::default(),
proposal_policy: PluginProposalPolicy::default(),
}
}
}