Skip to main content

easyofd_core/extensions/
extensions.rs

1//! 扩展根节点。
2
3use super::CtExtension;
4
5/// 对应 Java: org.ofdrw.core.extendObj.Extensions
6///
7/// OFD 文档扩展根节点,包含所有扩展定义。
8#[derive(Debug, Clone)]
9pub struct Extensions {
10    /// 扩展列表。
11    pub extensions: Vec<CtExtension>,
12}
13
14impl Extensions {
15    /// 创建空的扩展容器。
16    #[must_use]
17    pub fn new() -> Self {
18        Self {
19            extensions: Vec::new(),
20        }
21    }
22
23    /// 添加一个扩展。
24    pub fn push(&mut self, ext: CtExtension) {
25        self.extensions.push(ext);
26    }
27
28    /// 序列化为 XML 字符串。
29    #[must_use]
30    pub fn to_xml_string(&self) -> String {
31        let inner: String = self
32            .extensions
33            .iter()
34            .map(CtExtension::to_xml_string)
35            .collect();
36        format!("<Extensions>{inner}</Extensions>")
37    }
38}
39
40impl Default for Extensions {
41    fn default() -> Self {
42        Self::new()
43    }
44}
45
46#[cfg(test)]
47mod tests {
48    use super::*;
49    use crate::extensions::Property;
50
51    #[test]
52    fn test_extensions_new() {
53        let e = Extensions::new();
54        assert!(e.extensions.is_empty());
55        let e2 = Extensions::default();
56        assert!(e2.extensions.is_empty());
57    }
58
59    #[test]
60    fn test_extensions_push_and_xml() {
61        let mut e = Extensions::new();
62        e.push(CtExtension::new("ext1", "1.0").with_property(Property::new("key", "val")));
63        assert_eq!(e.extensions.len(), 1);
64        let xml = e.to_xml_string();
65        assert!(xml.contains("<Extensions>"));
66        assert!(xml.contains("</Extensions>"));
67        assert!(xml.contains("ext1"));
68    }
69}