#vcard #contact #parser #rfc-6350

vcard4

基于RFC6350的快速且准确的vCard解析器

17个版本

0.5.2 2024年6月28日
0.5.0 2024年2月9日
0.4.4 2023年4月18日
0.4.3 2023年3月20日
0.1.4 2022年11月9日

#518 in 日期和时间

Download history 20/week @ 2024-04-25 33/week @ 2024-05-02 48/week @ 2024-05-09 126/week @ 2024-05-16 76/week @ 2024-05-23 46/week @ 2024-05-30 47/week @ 2024-06-06 212/week @ 2024-06-13 104/week @ 2024-06-20 341/week @ 2024-06-27 95/week @ 2024-07-04 55/week @ 2024-07-11 59/week @ 2024-07-18 148/week @ 2024-07-25 77/week @ 2024-08-01 73/week @ 2024-08-08

每月下载量 361次
7个Crates(2直接)中使用

MIT/Apache

155KB
4K SLoC

VCARD

基于RFC6350的快速且准确的vCard解析器;有关更多信息,请参阅API文档

为了与旧软件兼容,解析器将接受具有值为CHARSET的输入,值为UTF-8,任何其他编码值都将产生错误。然而,此参数不是RFC6350的一部分,因此不包括在vCard的字符串输出中。

许可证为MIT或Apache-2.0。


lib.rs:

基于RFC6350的快速且准确的vCard解析器。

由于vCard固含私人信息,因此该库实现了一个zeroize特性(默认启用),以便在vCard被丢弃时安全地将所有数据在vCard中的内存归零。

某些外部类型无法进行zeroize,因为这些类型实施外部特质的限制,因此豁免。

  • Uri
  • Time / UtcOffset / OffsetDateTime
  • LanguageTag(特性:language-tags
  • Mime(特性:mime

如果启用了mime特性,则将MEDIATYPE参数解析为Mime结构,否则它是一个String

如果启用了language-tags特性,则使用language-tags crate解析LANG属性和LANGUAGE参数。

可以通过启用serde特性来启用Serde支持。

示例

创建一个新的vCard

use vcard4::VcardBuilder;
let card = VcardBuilder::new("John Doe".to_owned())
    .nickname("Johnny".to_owned())
    .finish();
print!("{}", card);

解码和编码

use anyhow::Result;
use vcard4::parse;
pub fn main() -> Result<()> {
    let input = r#"BEGIN:VCARD
VERSION:4.0
FN:John Doe
NICKNAME:Johnny
END:VCARD"#;
    let cards = parse(input)?;
    let card = cards.first().unwrap();
    let encoded = card.to_string();
    let decoded = parse(&encoded)?.remove(0);
    assert_eq!(card, &decoded);
    Ok(())
}

迭代解析在您只需要第一个vCard或者想要忽略有错误的vCard(可能在导入操作期间)时很有用。

use anyhow::Result;
use vcard4::iter;

pub fn main() -> Result<()> {
    let input = r#"BEGIN:VCARD
VERSION:4.0
FN:John Doe
END:VCARD

BEGIN:VCARD
VERSION:4.0
FN:Jane Doe
END:VCARD"#;
    let mut it = iter(input, true);
    print!("{}", it.next().unwrap()?);
    print!("{}", it.next().unwrap()?);
    assert!(matches!(it.next(), None));
    Ok(())
}

实现

  • XML属性会被解析和传播,但由于它在RFC中是可选的,所以不会进行验证。
  • IANA令牌尚未实现。
  • RFC要求行断行符为CRLF序列,但为了便于平台之间的互操作性,我们将回车符视为可选。

依赖关系

~5.5MB
~69K SLoC