From 3b170f78666b66d0f90d84b1b8d1decac40bf00e Mon Sep 17 00:00:00 2001 From: Shautvast Date: Thu, 24 Jul 2025 11:30:06 +0200 Subject: [PATCH] added project parser --- src/main.rs | 7 +++-- src/maven/mod.rs | 1 + src/maven/pom.rs | 2 +- src/maven/pom_parser.rs | 6 ++--- src/maven/project_parser.rs | 41 ++++++++++++++++++++++++++++++ tests/maven/mod.rs | 3 ++- tests/maven/pom_parser_test.rs | 2 +- tests/maven/project_parser_test.rs | 3 +++ 8 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 src/maven/project_parser.rs create mode 100644 tests/maven/project_parser_test.rs diff --git a/src/main.rs b/src/main.rs index a4a0162..6d17762 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,7 @@ +use std::path::Path; +use undeepend::maven::project_parser::parse_project; + fn main() { - let message = &"xmlns:Hello, world!"[6..]; - println!("{}",message); + let project = parse_project(Path::new("tests/maven/resources/sample_project")).unwrap(); + println!("{:?}", project); } diff --git a/src/maven/mod.rs b/src/maven/mod.rs index c5c8ef4..f212c95 100644 --- a/src/maven/mod.rs +++ b/src/maven/mod.rs @@ -2,3 +2,4 @@ pub mod metadata; pub mod pom; pub mod pom_view; pub mod pom_parser; +pub mod project_parser; diff --git a/src/maven/pom.rs b/src/maven/pom.rs index 1354282..a20319d 100644 --- a/src/maven/pom.rs +++ b/src/maven/pom.rs @@ -8,7 +8,7 @@ pub struct Pom { pub group_id: Option, pub artifact_id: String, pub version: Option, - pub name: String, + pub name: Option, pub packaging: Option, pub url: Option, pub dependencies: Vec, diff --git a/src/maven/pom_parser.rs b/src/maven/pom_parser.rs index ee3aec3..2d104e9 100644 --- a/src/maven/pom_parser.rs +++ b/src/maven/pom_parser.rs @@ -3,7 +3,7 @@ use crate::xml::SaxError; use crate::xml::dom_parser::{Node, get_document}; use std::collections::HashMap; -pub fn get_pom(xml: &str) -> Result { +pub fn get_pom(xml: impl Into) -> Result { let mut group_id = None; let mut artefact_id = None; let mut parent = None; @@ -16,7 +16,7 @@ pub fn get_pom(xml: &str) -> Result { let mut properties = HashMap::new(); // useless assignment... let mut modules = vec![]; // not useless assignment... - for child in get_document(xml)?.root.children { + for child in get_document(xml.into().as_str())?.root.children { match child.name.as_str() { "groupId" => group_id = child.text, "artifactId" => artefact_id = child.text, @@ -37,7 +37,7 @@ pub fn get_pom(xml: &str) -> Result { group_id, artifact_id: artefact_id.unwrap(), version, - name: name.unwrap(), + name, packaging, url, dependencies, diff --git a/src/maven/project_parser.rs b/src/maven/project_parser.rs new file mode 100644 index 0000000..1feee7d --- /dev/null +++ b/src/maven/project_parser.rs @@ -0,0 +1,41 @@ +use crate::maven::pom::Pom; +use crate::maven::pom_parser::get_pom; +use std::fs; +use std::path::Path; + +pub fn parse_project(project_dir: &Path) -> Result { + if !project_dir.is_dir() { + return Err(format!("{:?} is not a directory", project_dir)); + } + + let mut pom_file = project_dir.to_path_buf(); + pom_file.push(Path::new("pom.xml")); + + let pom_file = fs::read_to_string(pom_file).map_err(|e| e.to_string())?; + let root = get_pom(pom_file).map_err(|e| e.to_string())?; + + let modules= root.modules + .iter() + .map(|module| read_module_pom(project_dir, module)) + .collect(); + + Ok(Project { + root, + modules, + }) +} + +fn read_module_pom(project_dir: &Path, module: &String) -> Pom { + let mut module_file = project_dir.to_path_buf(); + module_file.push(Path::new(module)); + module_file.push(Path::new("pom.xml")); + let module_pom = fs::read_to_string(module_file) + .expect(format!("Cannot read file {}", module).as_str()); + get_pom(module_pom).expect(format!("Cannot create module pom {}", module).as_str()) +} + +#[derive(Debug)] +pub struct Project { + pub root: Pom, + pub modules: Vec, +} diff --git a/tests/maven/mod.rs b/tests/maven/mod.rs index a3638b2..9258f28 100644 --- a/tests/maven/mod.rs +++ b/tests/maven/mod.rs @@ -1 +1,2 @@ -mod pom_parser_test; \ No newline at end of file +mod pom_parser_test; +mod project_parser_test; \ No newline at end of file diff --git a/tests/maven/pom_parser_test.rs b/tests/maven/pom_parser_test.rs index c18652b..84b4a13 100644 --- a/tests/maven/pom_parser_test.rs +++ b/tests/maven/pom_parser_test.rs @@ -4,7 +4,7 @@ use undeepend::maven::pom_parser::get_pom; fn test_pom_parser_is_correct() { let test_xml = include_str!("../maven/resources/pom.xml"); let pom = get_pom(test_xml).expect("failed to get document"); - assert_eq!("Mockito",pom.name); + assert_eq!(Some("Mockito".to_string()),pom.name); assert_eq!(Some("org.mockito".to_string()),pom.group_id); assert_eq!("mockito-core",pom.artifact_id); assert_eq!(Some("1.9.5".to_string()),pom.version); diff --git a/tests/maven/project_parser_test.rs b/tests/maven/project_parser_test.rs new file mode 100644 index 0000000..601531e --- /dev/null +++ b/tests/maven/project_parser_test.rs @@ -0,0 +1,3 @@ +use std::path::Path; +use undeepend::maven::project_parser::parse_project; +