Skip to main content

excelize_rs/xml/
custom.rs

1//! Custom file properties part (`docProps/custom.xml`).
2//!
3//! Ported from Go `xmlCustom.go`.
4
5use serde::{Deserialize, Serialize};
6
7/// Directly maps the element for the custom file properties part, that
8/// represents additional information. The information can be used as metadata
9/// for XML.
10#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
11#[serde(rename = "Properties")]
12pub struct XlsxCustomProperties {
13    #[serde(rename = "@xmlns", default)]
14    pub xmlns: Option<String>,
15    #[serde(rename = "@xmlns:vt", default)]
16    pub vt: Option<String>,
17    #[serde(rename = "property", default)]
18    pub property: Vec<XlsxProperty>,
19}
20
21/// Directly maps the element specifies a single custom file property. Custom
22/// file property type is defined through child elements in the File Properties
23/// Variant Type namespace. Custom file property value can be set by setting the
24/// appropriate Variant Type child element value.
25#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
26pub struct XlsxProperty {
27    #[serde(rename = "@fmtid", default)]
28    pub fmt_id: String,
29    #[serde(rename = "@pid", default)]
30    pub pid: i64,
31    #[serde(rename = "@name", default, skip_serializing_if = "Option::is_none")]
32    pub name: Option<String>,
33    #[serde(
34        rename = "@linkTarget",
35        default,
36        skip_serializing_if = "Option::is_none"
37    )]
38    pub link_target: Option<String>,
39    #[serde(rename = "vt:vector", default, skip_serializing_if = "Option::is_none")]
40    pub vector: Option<String>,
41    #[serde(rename = "vt:array", default, skip_serializing_if = "Option::is_none")]
42    pub array: Option<String>,
43    #[serde(rename = "vt:blob", default, skip_serializing_if = "Option::is_none")]
44    pub blob: Option<String>,
45    #[serde(rename = "vt:oblob", default, skip_serializing_if = "Option::is_none")]
46    pub oblob: Option<String>,
47    #[serde(rename = "vt:empty", default, skip_serializing_if = "Option::is_none")]
48    pub empty: Option<String>,
49    #[serde(rename = "vt:null", default, skip_serializing_if = "Option::is_none")]
50    pub null: Option<String>,
51    #[serde(rename = "vt:i1", default, skip_serializing_if = "Option::is_none")]
52    pub i1: Option<i8>,
53    #[serde(rename = "vt:i2", default, skip_serializing_if = "Option::is_none")]
54    pub i2: Option<i16>,
55    #[serde(rename = "vt:i4", default, skip_serializing_if = "Option::is_none")]
56    pub i4: Option<i32>,
57    #[serde(rename = "vt:i8", default, skip_serializing_if = "Option::is_none")]
58    pub i8: Option<i64>,
59    #[serde(rename = "vt:int", default, skip_serializing_if = "Option::is_none")]
60    pub int: Option<i64>,
61    #[serde(rename = "vt:ui1", default, skip_serializing_if = "Option::is_none")]
62    pub ui1: Option<u8>,
63    #[serde(rename = "vt:ui2", default, skip_serializing_if = "Option::is_none")]
64    pub ui2: Option<u16>,
65    #[serde(rename = "vt:ui4", default, skip_serializing_if = "Option::is_none")]
66    pub ui4: Option<u32>,
67    #[serde(rename = "vt:ui8", default, skip_serializing_if = "Option::is_none")]
68    pub ui8: Option<u64>,
69    #[serde(rename = "vt:uint", default, skip_serializing_if = "Option::is_none")]
70    pub uint: Option<u64>,
71    #[serde(rename = "vt:r4", default, skip_serializing_if = "Option::is_none")]
72    pub r4: Option<f32>,
73    #[serde(rename = "vt:r8", default, skip_serializing_if = "Option::is_none")]
74    pub r8: Option<f64>,
75    #[serde(
76        rename = "vt:decimal",
77        default,
78        skip_serializing_if = "Option::is_none"
79    )]
80    pub decimal: Option<String>,
81    #[serde(rename = "vt:lpstr", default, skip_serializing_if = "Option::is_none")]
82    pub lpstr: Option<String>,
83    #[serde(rename = "vt:lpwstr", default, skip_serializing_if = "Option::is_none")]
84    pub lpwstr: Option<String>,
85    #[serde(rename = "vt:bstr", default, skip_serializing_if = "Option::is_none")]
86    pub bstr: Option<String>,
87    #[serde(rename = "vt:date", default, skip_serializing_if = "Option::is_none")]
88    pub date: Option<String>,
89    #[serde(
90        rename = "vt:filetime",
91        default,
92        skip_serializing_if = "Option::is_none"
93    )]
94    pub file_time: Option<String>,
95    #[serde(rename = "vt:bool", default, skip_serializing_if = "Option::is_none")]
96    pub r#bool: Option<bool>,
97    #[serde(rename = "vt:cy", default, skip_serializing_if = "Option::is_none")]
98    pub cy: Option<String>,
99    #[serde(rename = "vt:error", default, skip_serializing_if = "Option::is_none")]
100    pub error: Option<String>,
101    #[serde(rename = "vt:stream", default, skip_serializing_if = "Option::is_none")]
102    pub stream: Option<String>,
103    #[serde(
104        rename = "vt:ostream",
105        default,
106        skip_serializing_if = "Option::is_none"
107    )]
108    pub ostream: Option<String>,
109    #[serde(
110        rename = "vt:storage",
111        default,
112        skip_serializing_if = "Option::is_none"
113    )]
114    pub storage: Option<String>,
115    #[serde(
116        rename = "vt:ostorage",
117        default,
118        skip_serializing_if = "Option::is_none"
119    )]
120    pub ostorage: Option<String>,
121    #[serde(
122        rename = "vt:vstream",
123        default,
124        skip_serializing_if = "Option::is_none"
125    )]
126    pub vstream: Option<String>,
127    #[serde(rename = "vt:clsid", default, skip_serializing_if = "Option::is_none")]
128    pub cls_id: Option<String>,
129}
130
131/// Deserialization-only representation of the custom file properties part.
132#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
133#[serde(rename = "Properties")]
134pub struct DecodeCustomProperties {
135    #[serde(rename = "@xmlns", default)]
136    pub xmlns: Option<String>,
137    #[serde(rename = "@xmlns:vt", default)]
138    pub vt: Option<String>,
139    #[serde(rename = "property", default)]
140    pub property: Vec<DecodeProperty>,
141}
142
143/// Deserialization-only representation of a single custom file property.
144#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
145pub struct DecodeProperty {
146    #[serde(rename = "@fmtid", default)]
147    pub fmt_id: String,
148    #[serde(rename = "@pid", default)]
149    pub pid: i64,
150    #[serde(rename = "@name", default)]
151    pub name: Option<String>,
152    #[serde(rename = "@linkTarget", default)]
153    pub link_target: Option<String>,
154    #[serde(rename = "vector", default)]
155    pub vector: Option<String>,
156    #[serde(rename = "array", default)]
157    pub array: Option<String>,
158    #[serde(rename = "blob", default)]
159    pub blob: Option<String>,
160    #[serde(rename = "oblob", default)]
161    pub oblob: Option<String>,
162    #[serde(rename = "empty", default)]
163    pub empty: Option<String>,
164    #[serde(rename = "null", default)]
165    pub null: Option<String>,
166    #[serde(rename = "i1", default)]
167    pub i1: Option<i8>,
168    #[serde(rename = "i2", default)]
169    pub i2: Option<i16>,
170    #[serde(rename = "i4", default)]
171    pub i4: Option<i32>,
172    #[serde(rename = "i8", default)]
173    pub i8: Option<i64>,
174    #[serde(rename = "int", default)]
175    pub int: Option<i64>,
176    #[serde(rename = "ui1", default)]
177    pub ui1: Option<u8>,
178    #[serde(rename = "ui2", default)]
179    pub ui2: Option<u16>,
180    #[serde(rename = "ui4", default)]
181    pub ui4: Option<u32>,
182    #[serde(rename = "ui8", default)]
183    pub ui8: Option<u64>,
184    #[serde(rename = "uint", default)]
185    pub uint: Option<u64>,
186    #[serde(rename = "r4", default)]
187    pub r4: Option<f32>,
188    #[serde(rename = "r8", default)]
189    pub r8: Option<f64>,
190    #[serde(rename = "decimal", default)]
191    pub decimal: Option<String>,
192    #[serde(rename = "lpstr", default)]
193    pub lpstr: Option<String>,
194    #[serde(rename = "lpwstr", default)]
195    pub lpwstr: Option<String>,
196    #[serde(rename = "bstr", default)]
197    pub bstr: Option<String>,
198    #[serde(rename = "date", default)]
199    pub date: Option<String>,
200    #[serde(rename = "filetime", default)]
201    pub file_time: Option<String>,
202    #[serde(rename = "bool", default)]
203    pub r#bool: Option<bool>,
204    #[serde(rename = "cy", default)]
205    pub cy: Option<String>,
206    #[serde(rename = "error", default)]
207    pub error: Option<String>,
208    #[serde(rename = "stream", default)]
209    pub stream: Option<String>,
210    #[serde(rename = "ostream", default)]
211    pub ostream: Option<String>,
212    #[serde(rename = "storage", default)]
213    pub storage: Option<String>,
214    #[serde(rename = "ostorage", default)]
215    pub ostorage: Option<String>,
216    #[serde(rename = "vstream", default)]
217    pub vstream: Option<String>,
218    #[serde(rename = "clsid", default)]
219    pub cls_id: Option<String>,
220}
221
222/// Directly maps the custom property of the workbook. The value date type may be
223/// one of the following: int32, float64, string, bool, time.Time, or nil.
224#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
225pub struct CustomProperty {
226    pub name: String,
227    pub value: Option<CustomPropertyValue>,
228}
229
230/// Value types that can be stored in a custom property.
231#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
232#[serde(untagged)]
233pub enum CustomPropertyValue {
234    Int(i32),
235    Float(f64),
236    Bool(bool),
237    Date(String),
238    String(String),
239}