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 metadata;
pub mod pom; pub mod pom;
pub mod pom_view; 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 /// The Maven variant to parse poms
/// These structs is directly modelled after the XML because that is what strong-xml plugin requires /// These structs is directly modelled after the XML because that is what strong-xml plugin requires
#[derive(PartialEq, Debug)] #[derive(PartialEq, Debug)]
pub struct Pom { pub struct Pom {
pub(crate) parent: Option<Parent>, pub parent: Option<Parent>,
pub(crate) group_id: Option<String>, pub group_id: Option<String>,
pub(crate) artifact_id: String, pub artifact_id: String,
pub(crate) version: Option<String>, pub version: Option<String>,
pub(crate) name: String, pub name: String,
pub(crate) packaging: Option<String>, pub packaging: Option<String>,
pub(crate) url: Option<String>, pub url: Option<String>,
pub(crate) dependencies: Vec<Dependency>, pub dependencies: Vec<Dependency>,
pub(crate) dependency_management: Vec<Dependency>, pub dependency_management: Vec<Dependency>,
pub properties: HashMap<String, String>,
} }
#[derive(PartialEq, Debug)] #[derive(PartialEq, Debug)]
pub struct License { pub struct License {
pub(crate) name: String, pub name: String,
pub(crate) url: String, pub url: String,
pub(crate) distribution: Option<String>, pub distribution: Option<String>,
} }
#[derive(PartialEq, Debug)] #[derive(PartialEq, Debug)]
pub struct Parent { pub struct Parent {
pub(crate) group_id: String, pub group_id: String,
pub(crate) artifact_id: String, pub artifact_id: String,
pub(crate) version: String, pub version: String,
} }
#[derive(PartialEq, Debug)] #[derive(PartialEq, Debug)]
pub struct Developer { pub struct Developer {
pub(crate) id: Option<String>, pub id: Option<String>,
pub(crate) name: String, pub name: String,
} }
#[derive(PartialEq, Debug, Clone)] #[derive(PartialEq, Debug, Clone)]
pub struct Dependency { pub struct Dependency {
pub(crate) group_id: String, pub group_id: String,
pub(crate) artifact_id: String, pub artifact_id: String,
pub(crate) version: Option<String>, pub version: Option<String>,
} }
#[cfg(test)] #[cfg(test)]

View file

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

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> <version>1.9.5</version>
<name>Mockito</name> <name>Mockito</name>
<packaging>jar</packaging> <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> <url>http://www.mockito.org</url>
<description>Mock objects library for java</description> <description>Mock objects library for java</description>
<licenses> <licenses>

View file

@ -1,2 +1,2 @@
mod xml; 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] #[test]
fn test_dom_parser() { 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"); let doc = get_document(test_xml).expect("failed to get document");
println!("{:?}",doc); println!("{:?}",doc);
} }