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
|
||||
|
||||
I needed a more efficient way to store serialized rust ofjects than just
|
||||
serializing everything to JSON.
|
||||
|
||||
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
|
||||
A compact encoder / decoder pair that uses an binary encoding scheme similar
|
||||
to how the data is laid out in memory.
|
||||
|
|
|
|||
44
src/lib.rs
44
src/lib.rs
|
|
@ -2,11 +2,55 @@
|
|||
|
||||
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 reader::DecoderReader;
|
||||
|
||||
mod writer;
|
||||
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)]
|
||||
mod test;
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ use std::io::Reader;
|
|||
use std::io::BufferedReader;
|
||||
use std::io::IoError;
|
||||
use std::io::OtherIoError;
|
||||
use std::io::RefReader;
|
||||
use serialize::Decoder;
|
||||
|
||||
type EwResult = Result<(), IoError>;
|
||||
|
|
@ -12,9 +13,10 @@ pub struct DecoderReader<R> {
|
|||
|
||||
impl <R: Reader> DecoderReader<R> {
|
||||
pub fn new(r: R) -> DecoderReader<R> {
|
||||
DecoderReader{ reader: BufferedReader::new(r) }
|
||||
DecoderReader {
|
||||
reader: BufferedReader::new(r)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn unwrap(self) -> R {
|
||||
self.reader.unwrap()
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue