2 个不稳定版本
0.2.0 | 2023年8月2日 |
---|---|
0.1.0 | 2023年3月29日 |
#55 in #idiomatic
35KB
831 代码行
libxdiff
为 libxdiff
C 库提供安全、惯用的 Rust 绑定。
使用方法
将以下内容添加到您的 Cargo.toml
[dependencies]
libxdiff = "0.2"
示例
use core::str::from_utf8;
use libxdiff::MMFile;
let mut f1 = MMFile::from_bytes(b"hello world\n");
let mut f2 = MMFile::from_bytes(b"hello world!\n");
let mut diff_lines = Vec::<String>::new();
f1.diff_raw(&mut f2, |line: &[u8]| {
diff_lines.push(from_utf8(line).unwrap().to_owned());
})
.unwrap();
assert_eq!(
diff_lines,
vec![
"@@ -1,1 +1,1 @@\n",
"-", "hello world\n",
"+", "hello world!\n",
],
);
链接
上游 libxdiff
库体积小且没有依赖,因此此包将其静态链接。
lib.rs
:
Rust 的 libxdiff 绑定
此库包含对 libxdiff C 库的绑定。底层库使用非连续缓冲区的链来定义 "MMFiles",以最小化追加和修改时的实际分配。此包装器通过定义所有 MMFile
为紧凑型(由单个缓冲区支持)来结构化 API。非紧凑形式为 MMBlocks
。
libxdiff 在内部跟踪对缓冲区的迭代,因此一些在概念上是只读的操作最终需要 &mut
参数才能安全执行。
示例
use core::str::from_utf8;
use libxdiff::MMFile;
let mut f1 = MMFile::from_bytes(b"hello world\n");
let mut f2 = MMFile::from_bytes(b"hello world!\n");
let mut diff_lines = Vec::<String>::new();
f1.diff_raw(&mut f2, |line: &[u8]| {
diff_lines.push(from_utf8(line).unwrap().to_owned());
})
.unwrap();
assert_eq!(
diff_lines,
vec![
"@@ -1,1 +1,1 @@\n",
"-", "hello world\n",
"+", "hello world!\n",
],
);
依赖项
~0.6–2.5MB
~52K SLoC