use anyhow::Result;
use crate_plugin_kit::{CratePluginKit, PluginInfo, PluginManifest};
use pmpx_plugin::abi::PmpxPluginV1;
use pmpx_plugin::Family;
use super::InstalledPlugin;
pub(super) fn read_one(
kit: &CratePluginKit<PmpxPluginV1>,
info: &PluginInfo,
) -> Result<InstalledPlugin> {
let manifest = kit.manifest_of(&info.crate_name).ok();
let (strong, weak) = manifest.as_ref().map(detect_patterns).unwrap_or_default();
Ok(InstalledPlugin {
name: info.name.clone(),
crate_name: info.crate_name.clone(),
version: info.version.clone(),
family: info.family.clone().map(Family::new),
abi: info.abi,
dir: info.dir.clone(),
strong,
weak,
})
}
fn detect_patterns(manifest: &PluginManifest) -> (Vec<String>, Vec<String>) {
let Some(detect) = manifest.extra.get("detect") else {
return (Vec::new(), Vec::new());
};
(
str_array(detect.get("strong")),
str_array(detect.get("weak")),
)
}
fn str_array(value: Option<&toml::Value>) -> Vec<String> {
value
.and_then(|v| v.as_array())
.map(|items| {
items
.iter()
.filter_map(|x| x.as_str())
.map(str::to_string)
.collect()
})
.unwrap_or_default()
}