new post: A Rust library for LibLZF
This commit is contained in:
parent
1783adfadf
commit
e480ead6f9
43
_posts/2014-10-15-a-rust-library-for-liblzf.md
Normal file
43
_posts/2014-10-15-a-rust-library-for-liblzf.md
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: A Rust library for LibLZF
|
||||||
|
date: 15.10.2014 11:10
|
||||||
|
---
|
||||||
|
|
||||||
|
In the last four months I did not produce much open-source code. I was busy writing my Bachelor Thesis.
|
||||||
|
But I was active in the community, I attended several conferences, I read a lot of stuff and I wrote down a lot more things to do.
|
||||||
|
|
||||||
|
One of these things was "learn Rust", as you might figure (and writing more).
|
||||||
|
Well, I submitted my thesis on Monday and went on to write some actual Rust code.
|
||||||
|
|
||||||
|
So I created [lzf-rs][], a wrapper around [LibLZF][], a super small and fast compression library, originally written by Marc Lehmann.
|
||||||
|
LibLZF consists of just 4 files and is super-easy to compile as a small library.
|
||||||
|
LibLZF itself is used by [Redis](https://github.com/antirez/redis/blob/3c6f9ac37c849c82aebf5b45e895faa6cc80e7be/src/rdb.c#L222) for compressing strings in the RDB,
|
||||||
|
that's how I got to know it. I still don't know how it works, but I want to learn it now (and maybe port the whole code to Rust instead of using a wrapper around the C library?)
|
||||||
|
|
||||||
|
I used Rust's [Foreign Function Interface][ffi] to write the wrapper. Accessing C code from within Rust is quite simple.
|
||||||
|
The hard part is choosing the right data types and writing the API in a safe and usable way.
|
||||||
|
I'm not 100% happy with the current API of lzf-rs, so expect it to change.
|
||||||
|
I'm still in the process of figuring out what to expose and what not.
|
||||||
|
|
||||||
|
And now, enough of the talking. This is how to use the library:
|
||||||
|
|
||||||
|
~~~rust
|
||||||
|
use lzf;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let data = "foobar";
|
||||||
|
|
||||||
|
let compressed = lzf::compress(data.as_bytes()).unwrap();
|
||||||
|
|
||||||
|
let decompressed = lzf::decompress(compressed.as_slice(), data.len()).unwrap();
|
||||||
|
}
|
||||||
|
~~~
|
||||||
|
|
||||||
|
I'm happy to get some feedback. It's my first serious Rust code, so prone to bugs and maybe not to Rusty afterall.
|
||||||
|
Ping me on [Twitter][], drop me an [email](mailto:badboy@archlinux.us) or [open an issue](https://github.com/badboy/lzf-rs/issues).
|
||||||
|
|
||||||
|
[lzf-rs]: https://github.com/badboy/lzf-rs
|
||||||
|
[liblzf]: https://github.com/badboy/lzf-rs/blob/master
|
||||||
|
[ffi]: http://doc.rust-lang.org/guide-ffi.html
|
||||||
|
[twitter]: https://twitter.com/badboy_
|
Loading…
Reference in a new issue