use serde::Deserialize;
#[derive(Debug, Clone, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct PluginConfig {
pub id: String,
pub command: Vec<String>,
#[serde(default)]
pub config: toml::Table,
}
impl PluginConfig {
pub(super) fn validate(&self) -> anyhow::Result<()> {
let valid_id = self.id.chars().enumerate().all(|(index, character)| {
if index == 0 {
character.is_ascii_lowercase()
} else {
character.is_ascii_lowercase()
|| character.is_ascii_digit()
|| matches!(character, '-' | '_')
}
});
if self.id.is_empty() || !valid_id {
anyhow::bail!(
"plugin id `{}` is invalid; use a lowercase letter followed by lowercase letters, digits, `-` or `_`.",
self.id
);
}
if self.command.is_empty() || self.command[0].trim().is_empty() {
anyhow::bail!(
"plugin `{}` has no executable; `command` must be a non-empty array.",
self.id
);
}
Ok(())
}
}