use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename = "vt:variant")]
pub enum Variant {
#[serde(rename = "vt:vector")]
VtVector {
size: usize,
#[serde(rename = "baseType")]
base_type: String,
#[serde(rename = "$value")]
variants: Vec<Variant>,
},
#[serde(rename = "vt:variant")]
VtVariant {
#[serde(rename = "$value")]
value: Box<Variant>,
},
#[serde(rename = "vt:null")]
VtNull,
#[serde(rename = "vt:i1")]
VtI1(i8),
#[serde(rename = "vt:i2")]
VtI2(i8),
#[serde(rename = "vt:i4")]
VtI4(i8),
#[serde(rename = "vt:i8")]
VtI8(i8),
#[serde(rename = "vt:lpstr")]
VtLpstr(String),
#[serde(rename = "vt:lpwstr")]
VtLpwstr(String),
}
impl Default for Variant {
fn default() -> Self {
Variant::VtNull
}
}
#[test]
fn serde_vt_variant() {
let v = Variant::VtLpwstr("text".into());
let xml = quick_xml::se::to_string(&v).unwrap();
println!("{}", xml);
assert_eq!(format!("{}", xml), "<vt:lpwstr>text</vt:lpwstr>");
let vd = quick_xml::de::from_str(&xml).unwrap();
assert_eq!(v, vd);
let v = Variant::VtVariant { value: Box::new(v) };
let xml = quick_xml::se::to_string(&v).unwrap();
println!("{}", xml);
assert_eq!(xml, "<vt:variant><vt:lpwstr>text</vt:lpwstr></vt:variant>");
let vd = quick_xml::de::from_str(&xml).unwrap();
assert_eq!(v, vd);
}
#[test]
fn serde_vt_vector() {
let v = Variant::VtLpwstr("text".into());
let xml = quick_xml::se::to_string(&v).unwrap();
println!("{}", xml);
assert_eq!(format!("{}", xml), "<vt:lpwstr>text</vt:lpwstr>");
let vd = quick_xml::de::from_str(&xml).unwrap();
assert_eq!(v, vd);
let v = Variant::VtVector {
size: 1,
base_type: "lpwstr".into(),
variants: vec![v],
};
let xml = quick_xml::se::to_string(&v).unwrap();
println!("{}", xml);
assert_eq!(
xml,
r#"<vt:vector size="1" baseType="lpwstr"><vt:lpwstr>text</vt:lpwstr></vt:vector>"#
);
let vd = quick_xml::de::from_str(&xml).unwrap();
assert_eq!(v, vd);
}
#[test]
fn variant_serde() {
let v = Variant::VtLpwstr("text".into());
let xml = quick_xml::se::to_string(&v).unwrap();
println!("{}", xml);
assert_eq!(format!("{}", xml), "<vt:lpwstr>text</vt:lpwstr>");
let vd = quick_xml::de::from_str(&xml).unwrap();
assert_eq!(v, vd);
let v = Variant::VtVariant { value: Box::new(v) };
let xml = quick_xml::se::to_string(&v).unwrap();
println!("{}", xml);
assert_eq!(xml, "<vt:variant><vt:lpwstr>text</vt:lpwstr></vt:variant>");
let vd = quick_xml::de::from_str(&xml).unwrap();
assert_eq!(v, vd);
let v = Variant::VtLpwstr("text".into());
let xml = quick_xml::se::to_string(&v).unwrap();
println!("{}", xml);
assert_eq!(xml, "<vt:lpwstr>text</vt:lpwstr>");
let vd = quick_xml::de::from_str(&xml).unwrap();
assert_eq!(v, vd);
let v = Variant::VtVariant {
value: Box::new(Variant::VtI4(2)),
};
let xml = quick_xml::se::to_string(&v).unwrap();
println!("{}", xml);
assert_eq!(xml, "<vt:variant><vt:i4>2</vt:i4></vt:variant>");
let vd = quick_xml::de::from_str(&xml).unwrap();
assert_eq!(v, vd);
let v = Variant::VtVector {
size: 2,
base_type: "variant".into(),
variants: vec![v],
};
let xml = quick_xml::se::to_string(&v).unwrap();
println!("{}", xml);
assert_eq!(
xml,
r#"<vt:vector size="2" baseType="variant"><vt:variant><vt:i4>2</vt:i4></vt:variant></vt:vector>"#
);
let vd = quick_xml::de::from_str(&xml).unwrap();
assert_eq!(v, vd);
}