maven_rs/pom/editor/
dependency_management.rs1use edit_xml::Element;
2
3use crate::{
4 editor::{
5 XMLEditorError,
6 utils::{add_or_update_item, get_all_children_of_element},
7 },
8 pom::Dependency,
9};
10
11use super::PomEditor;
12impl PomEditor {
13 pub fn get_or_create_dependency_management_element(
20 &mut self,
21 ) -> DependencyManagementEditor<'_> {
22 DependencyManagementEditor::new(self)
23 }
24 pub fn get_dependency_management_element_or_none(
28 &mut self,
29 ) -> Option<DependencyManagementEditor<'_>> {
30 if self.has_build() {
31 return Some(DependencyManagementEditor::new(self));
32 }
33 None
34 }
35 pub fn has_dependency_management(&self) -> bool {
39 let root = self.root();
40 root.find(&self.document, "dependencyManagement").is_some()
41 }
42 pub fn delete_dependency_management(&mut self) -> Result<bool, XMLEditorError> {
46 let root = self.root();
47 let element = root.find(&self.document, "dependencyManagement");
48 if let Some(element) = element {
49 element.detach(&mut self.document)?;
50 Ok(true)
51 } else {
52 Ok(false)
53 }
54 }
55}
56#[derive(Debug)]
57pub struct DependencyManagementEditor<'a> {
58 parent: &'a mut PomEditor,
59 dependency_management_element: Element,
60}
61
62impl<'a> DependencyManagementEditor<'a> {
63 pub(super) fn new(parent: &'a mut PomEditor) -> Self {
64 let root = parent.root();
65 let build_element = crate::editor::utils::get_or_create_top_level_element(
66 "dependencyManagement",
67 &mut parent.document,
68 root,
69 );
70 Self {
71 parent,
72 dependency_management_element: build_element,
73 }
74 }
75 fn dependencies_element(&self) -> Option<Element> {
76 self.dependency_management_element
77 .find(&self.parent.document, "dependencies")
78 }
79 pub fn get_dependencies(&self) -> Result<Vec<Dependency>, XMLEditorError> {
80 let Some(dependencies_element) = self.dependencies_element() else {
81 return Ok(vec![]);
82 };
83 let result =
84 get_all_children_of_element::<Dependency>(&self.parent.document, dependencies_element)?;
85 Ok(result.into_iter().map(|(depend, _)| depend).collect())
86 }
87 pub fn add_or_update_dependency(
88 &mut self,
89 dependency: Dependency,
90 ) -> Result<Option<Dependency>, XMLEditorError> {
91 let dependencies_element = self.dependencies_element();
92 add_or_update_item(
93 &mut self.parent.document,
94 dependencies_element,
95 self.dependency_management_element,
96 dependency,
97 )
98 }
99}
100
101#[cfg(test)]
102mod tests {
103 use std::path::PathBuf;
104
105 use crate::pom::editor::PomEditor;
106
107 #[test]
108 fn test_read_no_dependencies() -> anyhow::Result<()> {
109 let xml = r#"
110 <?xml version="1.0" encoding="UTF-8"?>
111 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
112 <modelVersion>4.0.0</modelVersion>
113 <groupId>dev.kingtux</groupId>
114 <artifactId>test</artifactId>
115 <version>1</version>
116 </project>
117 "#;
118 let mut editor = PomEditor::load_from_str(xml).unwrap();
119 assert!(
120 !editor.has_dependency_management(),
121 "Should not have dependency management"
122 );
123 let dependency_management = editor.get_or_create_dependency_management_element();
124 let dependencies = dependency_management.get_dependencies().unwrap();
125 assert_eq!(dependencies.len(), 0);
126 Ok(())
127 }
128
129 #[test]
130 fn test_read_lwjgl_bom() -> anyhow::Result<()> {
131 let xml_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
132 .join("tests/data/test_poms/lwjgl-bom-3.3.4.pom");
133 let file = std::fs::read_to_string(xml_path)?;
134 let mut editor = PomEditor::load_from_str(&file)?;
135 assert!(
136 editor.has_dependency_management(),
137 "Should have dependency management"
138 );
139 let dependency_management = editor.get_or_create_dependency_management_element();
140 let dependencies = dependency_management.get_dependencies().unwrap();
141 for dependency in dependencies {
142 println!("{:?}", dependency);
143 }
144 Ok(())
145 }
146
147 #[test]
148 fn delete_dependency_management() -> anyhow::Result<()> {
149 let xml_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
150 .join("tests/data/test_poms/lwjgl-bom-3.3.4.pom");
151 let file = std::fs::read_to_string(xml_path)?;
152 let mut editor = PomEditor::load_from_str(&file)?;
153 assert!(
154 editor.has_dependency_management(),
155 "Should have dependency management"
156 );
157
158 editor.delete_dependency_management()?;
159
160 assert!(
161 !editor.has_dependency_management(),
162 "Should not have dependency management"
163 );
164 let saved_file = editor.write_to_str()?;
165
166 let editor = PomEditor::load_from_str(&saved_file)?;
167 assert!(
168 !editor.has_dependency_management(),
169 "Should not have dependency management"
170 );
171 println!("{}", saved_file);
172 Ok(())
173 }
174
175}