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 日期和时间
每月下载量 361次
在7个Crates(2直接)中使用
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