- Notifications
You must be signed in to change notification settings - Fork10
Rust FFI bindings and safe interface to libpostal.
License
pnordahl/rust-postal
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Bindings to the libpostal street address parsing/normalization C library.
This library providesrust-lang/rust-bindgen generated Rust <-> C bindings, and puts an ergonomic and safe Rust API on top of them.
This crate requires Rust 1.60 or newer.
Follow the README instructions atopenvenues/libpostal to install the shared library for your platform. Currently, the compiled object is dynamically linked when your project runs - static linkage could be supported in the future.
Addpostal
to yourCargo.toml
:
Add this to your Cargo.toml:
[dependencies]postal = "0.2"
Next, add this to your crate:
extern crate postal;
Note:libpostal
is not threadsafe. As a result, do not create more than onepostal::Context
per process.Context::expand_address
andContext::parse_address
do internal locking, and are safe to call concurrently.
This is an example of using theexpand_address
API:
externcrate postal;use postal::{Context,InitOptions,ExpandAddressOptions};// initialize a context to work withletmut ctx =Context::new();// enable address expansion for this contextctx.init(InitOptions{expand_address:true,parse_address:false}).unwrap();// these options are safe to persist and reuse between calls to `expand_address`letmut opts =ExpandAddressOptions::new();// (optional) set languages; this can improve runtime performance significantly, approximately 30% in benchmarksopts.set_languages(vec!["en"].as_slice());// expand a single address into a `postal::Expansions` iteratorlet exps = ctx.expand_address("1234 Cherry Ln, Podunk TX",&mut opts).unwrap();for ein exps{dbg!(e);}
This is how you might use theparse_address
API:
externcrate postal;use postal::{Context,InitOptions,ParseAddressOptions};// initialize a context to work withletmut ctx =Context::new();// enable address parsing for this contextctx.init(InitOptions{expand_address:false,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.letmut opts =ParseAddressOptions::new();// parse a single address into a `postal::Components` iteratorlet comps = ctx.parse_address("1234 Cherry Ln, Podunk TX",&mut opts).unwrap();for cin comps{dbg!(c);}
For more examples and usage, please refer to the tests or benchmarks.
This will buildbindgen
bindings, run the tests, and run the benchmarks.
cargo buildcargotest -- --nocapture --test-threads 1cargo bench
Note:--test-threads 1
is required due to the single-threaded nature oflibpostal
.
0.2.6
- Update bindgen and parking_lot, replace deprecated rustfmt_bindings with formatter for bindgen
0.2.2
- Resolve locking issue due to unbound Mutex guard.
0.2.1
- Make Component fields public.
0.2.0
- Added
parse_address
support.
- Added
0.1.0
- Initial release.
Distributed under the MIT license. SeeLICENSE
for more information.
- Fork it (https://github.com/pnordahl/rust-postal/fork)
- Create your feature branch (
git checkout -b feature/fooBar
) - Commit your changes (
git commit -am 'Add some fooBar'
) - Push to the branch (
git push origin feature/fooBar
) - Create a new Pull Request
About
Rust FFI bindings and safe interface to libpostal.
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Releases
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors3
Uh oh!
There was an error while loading.Please reload this page.