easyofd_core/extensions/
ct_extension.rs1use super::Property;
4
5#[derive(Debug, Clone)]
9pub struct CtExtension {
10 pub name: String,
12 pub version: String,
14 pub properties: Vec<Property>,
16}
17
18impl CtExtension {
19 #[must_use]
21 pub fn new(name: impl Into<String>, version: impl Into<String>) -> Self {
22 Self {
23 name: name.into(),
24 version: version.into(),
25 properties: Vec::new(),
26 }
27 }
28
29 #[must_use]
31 pub fn with_property(mut self, prop: Property) -> Self {
32 self.properties.push(prop);
33 self
34 }
35
36 pub fn push_property(&mut self, prop: Property) {
38 self.properties.push(prop);
39 }
40
41 #[must_use]
43 pub fn to_xml_string(&self) -> String {
44 let inner: String = self
45 .properties
46 .iter()
47 .map(Property::to_xml_string)
48 .collect();
49 format!(
50 "<Extension Name=\"{}\" Version=\"{}\">{inner}</Extension>",
51 self.name, self.version
52 )
53 }
54}
55
56#[cfg(test)]
57mod tests {
58 use super::*;
59
60 #[test]
61 fn test_ct_extension_new() {
62 let ext = CtExtension::new("myext", "1.0");
63 assert_eq!(ext.name, "myext");
64 assert_eq!(ext.version, "1.0");
65 assert!(ext.properties.is_empty());
66 }
67
68 #[test]
69 fn test_ct_extension_with_property_and_xml() {
70 let ext = CtExtension::new("myext", "2.0")
71 .with_property(Property::new("k1", "v1"))
72 .with_property(Property::new("k2", "v2"));
73 assert_eq!(ext.properties.len(), 2);
74 let xml = ext.to_xml_string();
75 assert!(xml.contains("Name=\"myext\""));
76 assert!(xml.contains("Version=\"2.0\""));
77 assert!(xml.contains("k1"));
78 assert!(xml.contains("v2"));
79 }
80}