use crate::error::VcardError;
use crate::traits::{HasCardinality, HasName, HasParameters, HasValue};
use crate::vcard::property::Property;
use crate::vcard::Vcard;
pub mod constants;
pub mod error;
pub mod parse;
pub mod traits;
pub mod vcard;
pub fn parse_vcards(input: &str) -> Result<Vec<Vcard>, VcardError> {
let mut vcards = Vec::new();
for data in parse::vcard::vcards(input.as_bytes())?.1 {
vcards.push(Vcard::try_from((None, data))?);
}
Ok(vcards)
}
pub fn parse_vcards_with_client(client: &str, input: &str) -> Result<Vec<Vcard>, VcardError> {
let mut vcards = Vec::new();
for data in parse::vcard::vcards(input.as_bytes())?.1 {
vcards.push(Vcard::try_from((Some(client.to_string()), data))?);
}
Ok(vcards)
}
#[cfg(test)]
mod tests {
use crate::constants::{TestData, VcardParseError};
use crate::{parse_vcards, VcardError};
fn _match((a, b): (&str, &str)) {
assert_eq!(parse_vcards(a).unwrap().first().unwrap().export(), b.to_string())
}
#[test]
fn parse_no_version() {
assert_eq!(parse_vcards(TestData::VCARD_ERROR_VERSION_MISSING).unwrap_err().parse_error().as_str(), VcardParseError::PROPERTY_VERSION_MISSING);
}
#[test]
fn parse_no_fullname() {
assert!(matches!(parse_vcards(TestData::VCARD_ERROR_FULLNAME_MISSING), Err(VcardError::PropertyFnMissing)));
}
#[test]
fn parse_begin_missing() {
assert_eq!(parse_vcards(TestData::VCARD_ERROR_BEGIN_MISSING).unwrap_err().parse_error().as_str(), VcardParseError::PROPERTY_BEGIN_MISSING);
}
#[test]
fn parse_end_missing() {
assert_eq!(parse_vcards(TestData::VCARD_ERROR_END_MISSING).unwrap_err().parse_error().as_str(), VcardParseError::PROPERTY_END_MISSING);
}
#[test]
fn parse_version_3() {
assert_eq!(parse_vcards(TestData::VCARD_ERROR_VERSION_INCORRECT).unwrap_err().parse_error().as_str(), VcardParseError::PROPERTY_VERSION);
}
#[test]
fn parse_sample_minimal() {
_match(TestData::VCARD_MATCH_MINIMAL);
}
#[test]
fn parse_concat() {
_match(TestData::VCARD_MATCH_CONCAT);
}
#[test]
fn parse_xname() {
_match(TestData::VCARD_MATCH_XNAME);
}
#[test]
fn sample_compound() {
_match(TestData::VCARD_MATCH_COMPOUND);
}
}