use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;
use anyhow::Result;
use crate::maven::discovery::VersionProperty;
use crate::maven::node::NodeChecker;
use crate::maven::pm_versions::PmVersionsChecker;
use crate::registry::CheckResult;
pub trait ToolVersionChecker: Send + Sync {
fn patterns(&self) -> &[&str];
fn label(&self, property: &VersionProperty) -> String;
fn check<'a>(
&'a self,
property: &'a VersionProperty,
source: &'a str,
) -> Pin<Box<dyn Future<Output = Result<CheckResult>> + Send + 'a>>;
}
pub struct ToolCheckerRegistry {
checkers: Vec<Arc<dyn ToolVersionChecker>>,
}
impl ToolCheckerRegistry {
pub fn new(stable: bool) -> Self {
Self {
checkers: vec![
Arc::new(NodeChecker::new(stable)),
Arc::new(PmVersionsChecker::new()),
],
}
}
pub fn find(&self, property_name: &str) -> Option<Arc<dyn ToolVersionChecker>> {
self.checkers
.iter()
.find(|c| c.patterns().contains(&property_name))
.cloned()
}
}