#libpostal #bindings #interface #safe #parser #addresses #context

sys postal

FFI 绑定和安全的 libpostal 接口

8 个版本

0.2.6 2023年9月26日
0.2.5 2022年9月10日
0.2.4 2020年7月15日
0.2.3 2019年8月15日
0.1.0 2019年7月9日

#1 in #libpostal

MIT 许可证

21KB
447 代码行,不含注释

rust-postal

libpostal 街道地址解析/归一化 C 库的绑定。

Build Status Cargo

此库提供由 rust-lang/rust-bindgen 生成的 Rust <-> C 绑定,并在其上提供直观且安全的 Rust API。

此软件包需要 Rust 1.60 或更高版本。

安装

按照 openvenues/libpostal 中的 README 指令安装您平台的共享库。目前,当您的项目运行时,编译对象是动态链接的 - 未来可能会支持静态链接。

postal 添加到您的 Cargo.toml

将以下内容添加到您的 Cargo.toml 中

[dependencies]
postal = "0.2"

接下来,将以下内容添加到您的软件包中

extern crate postal;

使用示例(expand_address)

注意libpostal 不是线程安全的。因此,每个进程不要创建多个 postal::ContextContext::expand_addressContext::parse_address 进行内部锁定,可以并发调用。

这是使用 expand_address API 的示例

extern crate postal;
use postal::{Context, InitOptions, ExpandAddressOptions};

// initialize a context to work with
let mut ctx = Context::new();

// enable address expansion for this context
ctx.init(InitOptions{expand_address: true}).unwrap();

// these options are safe to persist and reuse between calls to `expand_address`
let mut opts = ExpandAddressOptions::new();

// (optional) set languages; this can improve runtime performance significantly, approximately 30% in benchmarks
opts.set_languages(vec!["en"].as_slice());

// expand a single address into a `postal::Expansions` iterator
let exps = ctx.expand_address(
	"1234 Cherry Ln, Podunk TX", &mut opts)
	.unwrap();
for e in exps {
	dbg!(e);
}

这是使用 parse_address API 的方法

extern crate postal;
use postal::{Context, InitOptions, ParseAddressOptions};

// initialize a context to work with
let mut ctx = Context::new();

// enable address parsing for this context
ctx.init(InitOptions{parse_address: true}).unwrap();

// these options are safe to persist and reuse between calls to `parse_address`.
// Note: `language` and `country` are technically options that libpostal will accept
// for purposes of parsing addresses, but it ignores them at present.
let mut opts = ParseAddressOptions::new();

// parse a single address into a `postal::Components` iterator
let comps = ctx.parse_address(
	"1234 Cherry Ln, Podunk TX", &mut opts)
	.unwrap();
for c in comps {
	dbg!(c);
}

有关更多示例和用法,请参阅测试或基准测试。

开发设置

这将构建 bindgen 绑定,运行测试,并运行基准测试。

cargo build
cargo test -- --nocapture --test-threads 1
cargo bench

注意:由于 libpostal 是单线程的,因此需要 --test-threads 1

发布历史

  • 0.2.6

    • 更新 bindgen 和 parking_lot,用 bindgen 的格式化器替换过时的 rustfmt_bindings
  • 0.2.2

    • 解决由于未绑定 Mutex guard 而引起的锁定问题。
  • 0.2.1

    • 使组件字段公开。
  • 0.2.0

    • 添加了 parse_address 支持。
  • 0.1.0

    • 首次发布。

元数据

在 MIT 许可证下分发。有关更多信息,请参阅 LICENSE

贡献

  1. 将其分支(https://github.com/pnordahl/rust-postal/fork
  2. 创建您的功能分支(git checkout -b feature/fooBar
  3. 提交您的更改(git commit -am 'Add some fooBar'
  4. 推送到分支(git push origin feature/fooBar
  5. 创建一个新的Pull Request

依赖项

~0.5–7.5MB
~49K SLoC