maven_rs/pom/editor/
dependency_management.rs

1use 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    /// Creates a new [DependencyManagementEditor]
14    ///
15    /// If no `dependencyManagement` element is present, it will create one
16    /// # Note.
17    /// This function will hold a mutable reference to the PomEditor.
18    /// I would recommend using this function within a scope. To prevent borrowing issues.
19    pub fn get_or_create_dependency_management_element(
20        &mut self,
21    ) -> DependencyManagementEditor<'_> {
22        DependencyManagementEditor::new(self)
23    }
24    /// Checks if the `dependencyManagement` element is present in the pom file
25    ///
26    /// If the element is present, it will return Some(BuildEditor) else it will return None
27    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    /// Checks if the `dependencyManagement` element is present in the pom file
36    ///
37    /// If the `dependencyManagement` element is present, it will return true else it will return false
38    pub fn has_dependency_management(&self) -> bool {
39        let root = self.root();
40        root.find(&self.document, "dependencyManagement").is_some()
41    }
42    /// Deletes the `dependencyManagement` element from the pom file
43    ///
44    /// If the `dependencyManagement` element is present, it will delete it and return true else it will return false
45    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}