Skip to main content

easyofd_core/extensions/
ct_extension.rs

1//! 单个扩展。
2
3use super::Property;
4
5/// 对应 Java: org.ofdrw.core.extendObj.CT_Extension
6///
7/// 单个扩展定义,包含扩展名称、版本和属性列表。
8#[derive(Debug, Clone)]
9pub struct CtExtension {
10    /// 扩展名称。
11    pub name: String,
12    /// 扩展版本。
13    pub version: String,
14    /// 扩展属性列表。
15    pub properties: Vec<Property>,
16}
17
18impl CtExtension {
19    /// 创建新的扩展。
20    #[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    /// 添加属性(链式调用)。
30    #[must_use]
31    pub fn with_property(mut self, prop: Property) -> Self {
32        self.properties.push(prop);
33        self
34    }
35
36    /// 添加属性。
37    pub fn push_property(&mut self, prop: Property) {
38        self.properties.push(prop);
39    }
40
41    /// 序列化为 XML 字符串。
42    #[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}