use anyhow::Result;
use crate::analyzers::DepAnalyzer;
pub struct AnalyzerPlugin {
pub name: &'static str,
pub description: &'static str,
pub is_native: bool,
pub create: fn(&str, &toml::Value, bool) -> Result<Box<dyn DepAnalyzer>>,
pub defconfig_toml: fn() -> Option<String>,
pub known_fields: fn() -> &'static [&'static str],
}
unsafe impl Sync for AnalyzerPlugin {}
inventory::collect!(AnalyzerPlugin);
pub fn all_analyzer_plugins() -> impl Iterator<Item = &'static AnalyzerPlugin> {
inventory::iter::<AnalyzerPlugin>.into_iter()
}
pub fn all_analyzer_names() -> Vec<&'static str> {
let mut names: Vec<&str> = all_analyzer_plugins().map(|p| p.name).collect();
names.sort_unstable();
names
}
pub fn find_analyzer_plugin(name: &str) -> Option<&'static AnalyzerPlugin> {
all_analyzer_plugins().find(|p| p.name == name)
}
pub fn analyzer_name_parser() -> clap::builder::PossibleValuesParser {
clap::builder::PossibleValuesParser::new(all_analyzer_names())
}