maven_rs/pom/
parent.rs

1use derive_builder::Builder;
2use serde::{Deserialize, Serialize};
3
4use crate::editor::{
5    utils::{add_if_present, from_element_using_builder, sync_element},
6    ElementConverter, HasElementName, UpdatableElement,
7};
8
9#[derive(Debug, Clone, Default, PartialEq, Eq, Hash, Serialize, Deserialize, Builder)]
10#[serde(rename_all = "camelCase")]
11pub struct Parent {
12    #[builder(setter(into, strip_option), default)]
13    pub group_id: Option<String>,
14    #[builder(setter(into, strip_option), default)]
15    pub artifact_id: Option<String>,
16    #[builder(setter(into, strip_option), default)]
17    pub version: Option<String>,
18    #[builder(setter(into, strip_option), default)]
19    pub relative_path: Option<String>,
20}
21impl HasElementName for Parent {
22    fn element_name() -> &'static str {
23        "parent"
24    }
25}
26impl ElementConverter for Parent {
27    from_element_using_builder!(
28        ParentBuilder,
29        element,
30        document,
31        "groupId" => group_id,
32        "artifactId" => artifact_id,
33        "version" => version,
34        "relativePath" => relative_path
35    );
36
37    fn into_children(
38        self,
39        document: &mut edit_xml::Document,
40    ) -> Result<Vec<edit_xml::Element>, crate::editor::XMLEditorError> {
41        let Self {
42            group_id,
43            artifact_id,
44            version,
45            relative_path,
46        } = self;
47        let mut children = vec![];
48        add_if_present!(document, children, group_id, "groupId");
49        add_if_present!(document, children, artifact_id, "artifactId");
50        add_if_present!(document, children, version, "version");
51        add_if_present!(document, children, relative_path, "relativePath");
52        Ok(children)
53    }
54}
55
56impl UpdatableElement for Parent {
57    fn update_element(
58        &self,
59        element: edit_xml::Element,
60        document: &mut edit_xml::Document,
61    ) -> Result<(), crate::editor::XMLEditorError> {
62        sync_element(document, element, "version", self.version.as_deref());
63        sync_element(
64            document,
65            element,
66            "relativePath",
67            self.relative_path.as_deref(),
68        );
69        Ok(())
70    }
71}
72#[cfg(test)]
73mod tests {
74    use pretty_assertions::assert_eq;
75
76    use crate::editor::utils::test_utils;
77
78    pub use super::*;
79
80    #[test]
81    pub fn test_element_parse() -> anyhow::Result<()> {
82        let test_value = r#"
83            <parent>
84                <groupId>dev.wyatt-herkamp</groupId>
85                <artifactId>test</artifactId>
86                <version>1.0.0</version>
87            </parent>
88        "#;
89        let dep = test_utils::create_xml_to_element::<Parent>(test_value)?;
90        assert_eq!(
91            dep,
92            Parent {
93                group_id: Some("dev.wyatt-herkamp".to_string()),
94                artifact_id: Some("test".to_string()),
95                version: Some("1.0.0".to_string()),
96                ..Default::default()
97            }
98        );
99        println!("{:#?}", dep);
100        Ok(())
101    }
102}