use crate::core::{Base64, FromXml, IntoXml, StripWhitespace};
use crate::iq::{IqGetPayload, IqResultPayload, IqSetPayload};
use crate::ns::VCARD;
#[derive(FromXml, IntoXml, Debug, PartialEq, Clone)]
#[xml(namespace = VCARD, name = "PHOTO")]
pub struct Photo {
#[xml(child(namespace = VCARD, name = "TYPE", extract(text)))]
pub type_: String,
#[xml(child(namespace = VCARD, name = "BINVAL", extract(text(codec = Base64<StripWhitespace>))))]
pub binval: Vec<u8>,
}
#[derive(FromXml, IntoXml, Debug, PartialEq, Clone)]
#[xml(namespace = VCARD, name = "vCard", on_unknown_child = Ignore)]
pub struct VCard {
#[xml(child(default))]
pub photo: Option<Photo>,
}
impl IqGetPayload for VCard {}
impl IqSetPayload for VCard {}
impl IqResultPayload for VCard {}
#[cfg(test)]
mod tests {
use super::*;
use crate::Element;
use base64::Engine;
use std::str::FromStr;
#[test]
fn test_vcard() {
let bytes = [0u8, 1, 2, 129];
let test_vcard = format!(
r"<vCard xmlns='vcard-temp'>
<BDAY>1476-06-09</BDAY>
<ADR>
<CTRY>Italy</CTRY>
<LOCALITY>Verona</LOCALITY>
<HOME/>
</ADR>
<NICKNAME/>
<N><GIVEN>Juliet</GIVEN><FAMILY>Capulet</FAMILY></N>
<EMAIL>jcapulet@shakespeare.lit</EMAIL>
<PHOTO>
<TYPE>image/jpeg</TYPE>
<BINVAL>{}</BINVAL>
</PHOTO>
</vCard>",
base64::prelude::BASE64_STANDARD.encode(&bytes)
);
let test_vcard = Element::from_str(&test_vcard).expect("Failed to parse XML");
let test_vcard = VCard::try_from(test_vcard).expect("Failed to parse vCard");
let photo = test_vcard.photo.expect("No photo found");
assert_eq!(photo.type_, "image/jpeg".to_string());
assert_eq!(photo.binval, bytes);
}
#[test]
fn test_vcard_with_linebreaks() {
let test_vcard = r"<vCard xmlns='vcard-temp'>
<BDAY>1476-06-09</BDAY>
<ADR>
<CTRY>Italy</CTRY>
<LOCALITY>Verona</LOCALITY>
<HOME/>
</ADR>
<NICKNAME/>
<N><GIVEN>Juliet</GIVEN><FAMILY>Capulet</FAMILY></N>
<EMAIL>jcapulet@shakespeare.lit</EMAIL>
<PHOTO>
<TYPE>image/jpeg</TYPE>
<BINVAL>Zm9v
Cg==</BINVAL>
</PHOTO>
</vCard>";
let test_vcard = Element::from_str(&test_vcard).expect("Failed to parse XML");
let test_vcard = VCard::try_from(test_vcard).expect("Failed to parse vCard");
let photo = test_vcard.photo.expect("No photo found");
assert_eq!(photo.type_, "image/jpeg".to_string());
assert_eq!(photo.binval, b"foo\n");
}
}