From 2349c9e087220805448e5b0d4e2f1003ce7ca59a Mon Sep 17 00:00:00 2001 From: Alex Helfet Date: Thu, 21 Dec 2017 03:20:09 +0000 Subject: [PATCH] First test passed: send one frame. --- Cargo.toml | 1 + src/error.rs | 14 +++----------- src/lib.rs | 30 ++++++++++++++++++++++-------- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 78a7092..5196341 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,4 +10,5 @@ license = "MIT OR Apache-2.0" repository = "https://github.com/fluffysquirrels/framed" [dependencies] +cobs = "^0.1.2" error-chain = "^0.11.0" \ No newline at end of file diff --git a/src/error.rs b/src/error.rs index 6b74860..49c3507 100644 --- a/src/error.rs +++ b/src/error.rs @@ -8,17 +8,9 @@ error_chain! { } errors { - UnknownHeader(b: u8) { - description("unknown header byte"), - display("unknown header byte: {:x}", b), - } - EofDuringPacket { - description("end of file during packet"), - display("end of file during packet"), - } - EofBeforePacket { - description("end of file before packet"), - display("end of file before packet"), + CobsDecodeFailed { + description("COBS decode failed"), + display("COBS decode failed"), } } } diff --git a/src/lib.rs b/src/lib.rs index 12380b0..a109c72 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -14,46 +14,52 @@ #![deny(warnings)] #![feature(conservative_impl_trait)] +extern crate cobs; #[macro_use] extern crate error_chain; pub mod channel; pub mod error; -use error::{Result}; +use error::{Error, ErrorKind, Result}; use std::io::{Read, Write}; /// Sends frames over an underlying `io::Write` instance. pub struct Sender { - _w: W, + w: W, } impl Sender { pub fn new(w: W) -> Sender { Sender:: { - _w: w, + w: w, } } - pub fn send(&mut self, _f: &[u8]) -> Result<()> { - unimplemented!(); + pub fn send(&mut self, f: &[u8]) -> Result<()> { + let code = cobs::encode_vec(f); + self.w.write(&code)?; + Ok(()) } } /// Receives frames from an underlying `io::Read` instance. pub struct Receiver { - _r: R, + r: R, } impl Receiver { pub fn new(r: R) -> Receiver { Receiver:: { - _r: r, + r: r, } } pub fn recv(&mut self) -> Result> { - unimplemented!(); + let mut code = Vec::new(); + self.r.read_to_end(&mut code)?; + cobs::decode_vec(&code) + .map_err(|_| Error::from(ErrorKind::CobsDecodeFailed)) } } @@ -72,6 +78,14 @@ mod tests { assert_eq!(recvd, sent); } + // TODO: Test sending 2 different frames. + + // TODO: Test buffering: + // * Write half a frame + // * recv() returns nothing + // * Write the rest of the frame + // * recv() returns the whole frame + fn pair() -> (Sender, Receiver) { let c = Channel::new(); let tx = Sender::new(c.writer());