mirror of https://git.sr.ht/~stygianentity/bincode
implemented helper functions
This commit is contained in:
parent
635f81a9a3
commit
e13a2a42b1
|
|
@ -1,9 +1,4 @@
|
||||||
# Binary Encoder / Decoder
|
# Binary Encoder / Decoder
|
||||||
|
|
||||||
I needed a more efficient way to store serialized rust ofjects than just
|
A compact encoder / decoder pair that uses an binary encoding scheme similar
|
||||||
serializing everything to JSON.
|
to how the data is laid out in memory.
|
||||||
|
|
||||||
This encoder + decoder pair encodes the data that it recieves in a binary
|
|
||||||
format that is at least as space efficient as it is in memory.
|
|
||||||
|
|
||||||
This encoding strategy is not backwards compatible. If you change the
|
|
||||||
|
|
|
||||||
44
src/lib.rs
44
src/lib.rs
|
|
@ -2,11 +2,55 @@
|
||||||
|
|
||||||
extern crate serialize;
|
extern crate serialize;
|
||||||
|
|
||||||
|
use std::io::MemWriter;
|
||||||
|
use std::io::MemReader;
|
||||||
|
use std::io::IoError;
|
||||||
|
use serialize::Encodable;
|
||||||
|
use serialize::Decodable;
|
||||||
|
use serialize::Encoder;
|
||||||
|
use serialize::Decoder;
|
||||||
|
|
||||||
pub use writer::EncoderWriter;
|
pub use writer::EncoderWriter;
|
||||||
pub use reader::DecoderReader;
|
pub use reader::DecoderReader;
|
||||||
|
|
||||||
mod writer;
|
mod writer;
|
||||||
mod reader;
|
mod reader;
|
||||||
|
|
||||||
|
pub fn encode<T: Encodable<EncoderWriter<MemWriter>, IoError>>(t: &T) -> Result<Vec<u8>, IoError> {
|
||||||
|
match encode_into(t, MemWriter::new()) {
|
||||||
|
Ok(w) => Ok(w.unwrap()),
|
||||||
|
Err((w, e)) => Err(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn decode<T: Decodable<DecoderReader<MemReader>, IoError>>(b: Vec<u8>) ->
|
||||||
|
Result<(T, Vec<u8>), (IoError, Vec<u8>)> {
|
||||||
|
match decode_from(MemReader::new(b)) {
|
||||||
|
Ok((t, r)) => Ok((t, r.unwrap())),
|
||||||
|
Err((e, r)) => Err((e, r.unwrap()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn encode_into<W: Writer, T: Encodable<EncoderWriter<W>, IoError>>
|
||||||
|
(t: &T, w: W)
|
||||||
|
-> Result<W, (W, IoError)> {
|
||||||
|
let mut writer = writer::EncoderWriter::new(w);
|
||||||
|
match t.encode(&mut writer) {
|
||||||
|
Ok(()) => Ok(writer.unwrap()),
|
||||||
|
Err(e) => Err((writer.unwrap(), e))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn decode_from<R: Reader, T: Decodable<DecoderReader<R>, IoError>>(r: R) -> Result<(T, R), (IoError, R)> {
|
||||||
|
let mut reader = reader::DecoderReader::new(r);
|
||||||
|
let x: Result<T, IoError> = Decodable::decode(&mut reader);
|
||||||
|
let mem = reader.unwrap();
|
||||||
|
|
||||||
|
match x {
|
||||||
|
Ok(t) => Ok((t, mem)),
|
||||||
|
Err(e) => Err((e, mem))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test;
|
mod test;
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ use std::io::Reader;
|
||||||
use std::io::BufferedReader;
|
use std::io::BufferedReader;
|
||||||
use std::io::IoError;
|
use std::io::IoError;
|
||||||
use std::io::OtherIoError;
|
use std::io::OtherIoError;
|
||||||
|
use std::io::RefReader;
|
||||||
use serialize::Decoder;
|
use serialize::Decoder;
|
||||||
|
|
||||||
type EwResult = Result<(), IoError>;
|
type EwResult = Result<(), IoError>;
|
||||||
|
|
@ -12,9 +13,10 @@ pub struct DecoderReader<R> {
|
||||||
|
|
||||||
impl <R: Reader> DecoderReader<R> {
|
impl <R: Reader> DecoderReader<R> {
|
||||||
pub fn new(r: R) -> DecoderReader<R> {
|
pub fn new(r: R) -> DecoderReader<R> {
|
||||||
DecoderReader{ reader: BufferedReader::new(r) }
|
DecoderReader {
|
||||||
|
reader: BufferedReader::new(r)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn unwrap(self) -> R {
|
pub fn unwrap(self) -> R {
|
||||||
self.reader.unwrap()
|
self.reader.unwrap()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue