Rust FFI bindings to libversion, an advanced version string comparison library.
The C source is included as a Git submodule and compiled from source via CMake -- no system-level installation of libversion is required.
Add to Cargo.toml:
[dependencies]
libversion-sys = { git = "https://github.com/DUpdateSystem/libversion-sys" }use std::cmp::Ordering;
use libversion_sys::{compare, compare_with_flags, VERSIONFLAG_P_IS_PATCH};
assert_eq!(compare("1.0", "1.1"), Ordering::Less);
assert_eq!(compare("1.0", "1.0.0"), Ordering::Equal);
assert_eq!(compare("1.0alpha1", "1.0"), Ordering::Less);
// "p" as patch (post-release) instead of pre-release
assert_eq!(
compare_with_flags("1.0p1", "1.0", VERSIONFLAG_P_IS_PATCH, 0),
Ordering::Greater,
);use std::ffi::CString;
use libversion_sys::ffi;
let v1 = CString::new("1.0").unwrap();
let v2 = CString::new("2.0").unwrap();
let result = unsafe { ffi::version_compare2(v1.as_ptr(), v2.as_ptr()) };
assert_eq!(result, -1);| Flag | Description |
|---|---|
VERSIONFLAG_P_IS_PATCH |
Treat p as patch (post-release) instead of pre-release |
VERSIONFLAG_ANY_IS_PATCH |
Treat any letter sequence as post-release |
VERSIONFLAG_LOWER_BOUND |
Derive lowest possible version with the given prefix |
VERSIONFLAG_UPPER_BOUND |
Derive highest possible version with the given prefix |
- Rust (stable)
- CMake
- C compiler (gcc/clang)
- libclang (for bindgen)
On Ubuntu/Debian:
sudo apt-get install cmake libclang-devMIT -- see LICENSE.
The bundled libversion is also MIT licensed.