1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
use crate::jvm::psa_jvm::JvmProjectStructureAnalyzer; use crate::psa_project::Project; use crate::ProjectStructureAnalyzer; pub struct ProjectAnalyzer { analyzers: Vec<Box<dyn ProjectStructureAnalyzer>>, } impl ProjectAnalyzer { pub fn run(&self, path: &str) -> Option<Project> { for analyzer in self.analyzers.iter() { return match analyzer.is_related(path) { true => Some(analyzer.analysis(path)), _ => continue, }; } None } } impl Default for ProjectAnalyzer { fn default() -> Self { ProjectAnalyzer { analyzers: vec![Box::new(JvmProjectStructureAnalyzer::default())], } } } #[cfg(test)] mod tests { use crate::ProjectAnalyzer; use std::path::PathBuf; #[test] fn should_analysis_project() { let project_dir_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")) .parent() .unwrap() .to_path_buf() .join("_fixtures") .join("projects") .join("java") .join("simple") .clone(); let analyzer = ProjectAnalyzer::default(); let project_dir = project_dir_path.display().to_string(); let project = analyzer.run(project_dir.as_str()).unwrap(); assert_eq!(project.name, "simple"); assert_eq!(project.path, project_dir.as_str()); } #[test] fn should_return_none_when_build_file_not_exists() { let project_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")) .parent() .unwrap() .to_path_buf() .join("_fixtures") .join("projects") .join("java") .clone(); let analyzer = ProjectAnalyzer::default(); let project = analyzer.run(project_dir.display().to_string().as_str()); assert_eq!(project.is_none(), true); } }