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}