added properties (cost me 3 days to make this a 15 minute task)

This commit is contained in:
Shautvast 2025-07-24 09:34:45 +02:00
parent 5a8b9d83b4
commit 0e83ee914d
9 changed files with 69 additions and 34 deletions

View file

@ -1,4 +1,4 @@
pub mod metadata;
pub mod pom;
pub mod pom_view;
pub mod pom_reader;
pub mod pom_parser;

View file

@ -1,43 +1,46 @@
use std::collections::HashMap;
/// The Maven variant to parse poms
/// These structs is directly modelled after the XML because that is what strong-xml plugin requires
#[derive(PartialEq, Debug)]
pub struct Pom {
pub(crate) parent: Option<Parent>,
pub(crate) group_id: Option<String>,
pub(crate) artifact_id: String,
pub(crate) version: Option<String>,
pub(crate) name: String,
pub(crate) packaging: Option<String>,
pub(crate) url: Option<String>,
pub(crate) dependencies: Vec<Dependency>,
pub(crate) dependency_management: Vec<Dependency>,
pub parent: Option<Parent>,
pub group_id: Option<String>,
pub artifact_id: String,
pub version: Option<String>,
pub name: String,
pub packaging: Option<String>,
pub url: Option<String>,
pub dependencies: Vec<Dependency>,
pub dependency_management: Vec<Dependency>,
pub properties: HashMap<String, String>,
}
#[derive(PartialEq, Debug)]
pub struct License {
pub(crate) name: String,
pub(crate) url: String,
pub(crate) distribution: Option<String>,
pub name: String,
pub url: String,
pub distribution: Option<String>,
}
#[derive(PartialEq, Debug)]
pub struct Parent {
pub(crate) group_id: String,
pub(crate) artifact_id: String,
pub(crate) version: String,
pub group_id: String,
pub artifact_id: String,
pub version: String,
}
#[derive(PartialEq, Debug)]
pub struct Developer {
pub(crate) id: Option<String>,
pub(crate) name: String,
pub id: Option<String>,
pub name: String,
}
#[derive(PartialEq, Debug, Clone)]
pub struct Dependency {
pub(crate) group_id: String,
pub(crate) artifact_id: String,
pub(crate) version: Option<String>,
pub group_id: String,
pub artifact_id: String,
pub version: Option<String>,
}
#[cfg(test)]

View file

@ -1,6 +1,7 @@
use crate::maven::pom::{Dependency, Developer, Parent, Pom};
use crate::xml::SaxError;
use crate::xml::dom_parser::{Node, get_document};
use std::collections::HashMap;
pub fn get_pom(xml: &str) -> Result<Pom, SaxError> {
let mut group_id = None;
@ -12,6 +13,7 @@ pub fn get_pom(xml: &str) -> Result<Pom, SaxError> {
let mut url = None;
let mut dependencies = vec![];
let mut dependency_management = vec![];
let mut properties = HashMap::new(); //useless assignment...
for child in get_document(xml)?.root.children {
match child.name.as_str() {
@ -24,6 +26,7 @@ pub fn get_pom(xml: &str) -> Result<Pom, SaxError> {
"url" => url = child.text,
"dependencies" => dependencies = get_dependencies(child),
"dependencyManagement" => dependency_management = get_dependency_mgmt(child),
"properties" => properties = get_properties(child),
_ => {}
}
}
@ -36,12 +39,27 @@ pub fn get_pom(xml: &str) -> Result<Pom, SaxError> {
packaging,
url,
dependencies,
dependency_management
dependency_management,
properties,
})
}
fn get_properties(element: Node) -> HashMap<String, String> {
let mut properties = HashMap::new();
for property in element.children {
properties.insert(
property.name.clone(),
property
.text
.expect(format!("Cannot read property '{}'", property.name).as_str())
.to_string(),
);
}
properties
}
fn get_dependency_mgmt(element: Node) -> Vec<Dependency> {
if !element.children.is_empty(){
if !element.children.is_empty() {
get_dependencies(element.children.first().unwrap().clone())
} else {
vec![]

View file

@ -0,0 +1,17 @@
use undeepend::maven::pom_parser::get_pom;
use undeepend::xml::dom_parser::get_document;
#[test]
fn test_pom_parser() {
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("org.mockito".to_string()),pom.group_id);
assert_eq!("mockito-core",pom.artifact_id);
assert_eq!(Some("1.9.5".to_string()),pom.version);
assert_eq!(Some("jar".to_string()),pom.packaging);
assert_eq!(Some("http://www.mockito.org".to_string()),pom.url);
assert_eq!(2, pom.properties.len());
assert_eq!("17", pom.properties["maven.compiler.source"]);
assert_eq!("21", pom.properties["maven.compiler.target"]);
}

View file

@ -7,6 +7,12 @@
<version>1.9.5</version>
<name>Mockito</name>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
</properties>
<url>http://www.mockito.org</url>
<description>Mock objects library for java</description>
<licenses>

View file

@ -1,2 +1,2 @@
mod xml;
mod pom;
mod maven;

View file

@ -1,9 +0,0 @@
use undeepend::maven::pom_reader::get_pom;
use undeepend::xml::dom_parser::get_document;
#[test]
fn test_pom_parser() {
let test_xml = include_str!("../pom/resources/pom.xml");
let pom = get_pom(test_xml).expect("failed to get document");
println!("{:?}", pom);
}

View file

@ -2,7 +2,7 @@ use undeepend::xml::dom_parser::get_document;
#[test]
fn test_dom_parser() {
let test_xml = include_str!("../pom/resources/pom.xml");
let test_xml = include_str!("../maven/resources/pom.xml");
let doc = get_document(test_xml).expect("failed to get document");
println!("{:?}",doc);
}