implement Network send
This commit is contained in:
parent
1ae8bed86b
commit
aa55b5948e
@ -1,7 +1,7 @@
|
|||||||
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||||
|
|
||||||
#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
|
#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
|
||||||
pub struct Sha256(#[serde(serialize_with = "as_hex", deserialize_with = "from_hex")] [u8; 32]);
|
pub struct Sha256(#[serde(serialize_with = "as_hex", deserialize_with = "from_hex")] pub [u8; 32]);
|
||||||
|
|
||||||
fn as_hex<S>(hash: &[u8; 32], serializer: S) -> Result<S::Ok, S::Error>
|
fn as_hex<S>(hash: &[u8; 32], serializer: S) -> Result<S::Ok, S::Error>
|
||||||
where
|
where
|
||||||
|
@ -46,13 +46,28 @@ where
|
|||||||
// Just clone the connection.
|
// Just clone the connection.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Package::Binary(_) => {
|
Package::Binary(_) => {
|
||||||
connection.send(&Package::Error(400, "Unexpected Binary".to_string()))?;
|
connection.send(&Package::Error(400, "Unexpected Binary".to_string()))?;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Package::JsonTrue | Package::JsonFalse | Package::JsonNull => {
|
||||||
|
connection.send(&Package::Error(
|
||||||
|
400,
|
||||||
|
"Unexpected true, false or null. ".to_string(),
|
||||||
|
))?;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
Package::Json(Command::Ping {}) => {
|
Package::Json(Command::Ping {}) => {
|
||||||
connection.send(&Package::Json(Command::Pong {}))?;
|
connection.send(&Package::Json(Command::Pong {}))?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Package::Json(Command::Pong {}) => {
|
||||||
|
// Ignore
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: lots
|
// TODO: lots
|
||||||
_ => unimplemented!(),
|
_ => unimplemented!(),
|
||||||
}
|
}
|
||||||
|
@ -69,6 +69,12 @@ impl<R: Read + Sized, W: Write + Sized> Connection<R, W> {
|
|||||||
Connection { reader, writer }
|
Connection { reader, writer }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
pub fn destruct(self) -> (R, W) {
|
||||||
|
let Connection { reader, writer } = self;
|
||||||
|
(reader, writer)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn receive(&mut self) -> Result<Package> {
|
pub fn receive(&mut self) -> Result<Package> {
|
||||||
let mut payload_type_buffer = [0u8; 1];
|
let mut payload_type_buffer = [0u8; 1];
|
||||||
let mut reserved_buffer = [0u8; 3];
|
let mut reserved_buffer = [0u8; 3];
|
||||||
@ -172,7 +178,52 @@ impl<R: Read + Sized, W: Write + Sized> Connection<R, W> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn send(&mut self, pkg: &Package) -> Result<()> {
|
pub fn send(&mut self, pkg: &Package) -> Result<()> {
|
||||||
unimplemented!()
|
match pkg {
|
||||||
|
Package::JsonNull => self.send_json(&Option::<bool>::None),
|
||||||
|
Package::JsonTrue => self.send_json(&true),
|
||||||
|
Package::JsonFalse => self.send_json(&false),
|
||||||
|
Package::Json(cmd) => self.send_json(cmd),
|
||||||
|
|
||||||
|
Package::Binary(bin) => self.send_binary(bin),
|
||||||
|
Package::Error(code, msg) => self.send_error(*code, msg),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn send_json<J: 'static + Serialize + Sized>(&mut self, msg: &J) -> Result<()> {
|
||||||
|
let w = &mut self.writer;
|
||||||
|
|
||||||
|
let payload = serde_json::to_vec(msg).unwrap();
|
||||||
|
|
||||||
|
w.write_all(&[PACKAGE_TYPE_JSON, 42, 42, 42])?;
|
||||||
|
w.write_all(&(payload.len() as u32).to_be_bytes())?;
|
||||||
|
|
||||||
|
w.write_all(&payload[..])?;
|
||||||
|
|
||||||
|
w.flush()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn send_binary(&mut self, payload: &[u8]) -> Result<()> {
|
||||||
|
let w = &mut self.writer;
|
||||||
|
|
||||||
|
w.write_all(&[PACKAGE_TYPE_BIN, 42, 42, 42])?;
|
||||||
|
w.write_all(&(payload.len() as u32).to_be_bytes())?;
|
||||||
|
|
||||||
|
w.write_all(payload)?;
|
||||||
|
|
||||||
|
w.flush()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn send_error(&mut self, code: u16, msg: &str) -> Result<()> {
|
||||||
|
let w = &mut self.writer;
|
||||||
|
|
||||||
|
let payload = format!("{:03} {}", code, msg).into_bytes();
|
||||||
|
|
||||||
|
w.write_all(&[PACKAGE_TYPE_ERROR, 42, 42, 42])?;
|
||||||
|
w.write_all(&(payload.len() as u32).to_be_bytes())?;
|
||||||
|
|
||||||
|
w.write_all(&payload[..])?;
|
||||||
|
|
||||||
|
w.flush()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,6 +231,26 @@ impl<R: Read + Sized, W: Write + Sized> Connection<R, W> {
|
|||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
use crate::model::*;
|
||||||
|
|
||||||
|
// Utility fn
|
||||||
|
|
||||||
|
fn test_read_back(pkg: &Package) {
|
||||||
|
let dummy_read_data = [255u8];
|
||||||
|
|
||||||
|
// generate write
|
||||||
|
let mut c = Connection::new(&dummy_read_data[..], Vec::new());
|
||||||
|
c.send(&pkg).unwrap();
|
||||||
|
|
||||||
|
let (_, written) = c.destruct();
|
||||||
|
|
||||||
|
// read back in
|
||||||
|
let mut c = Connection::new(&written[..], Vec::new() /*dummy*/);
|
||||||
|
let read_back_pkg = c.receive().unwrap();
|
||||||
|
|
||||||
|
assert_eq!(&read_back_pkg, pkg)
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn read_error_good() {
|
fn read_error_good() {
|
||||||
let mut read_data = Vec::new();
|
let mut read_data = Vec::new();
|
||||||
@ -236,8 +307,6 @@ mod test {
|
|||||||
// we don't test the actual json parsing here,
|
// we don't test the actual json parsing here,
|
||||||
// since serde_json is well tested.
|
// since serde_json is well tested.
|
||||||
|
|
||||||
// AndTesting the declaration seams not worth the effort.
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn read_json_good() {
|
fn read_json_good() {
|
||||||
let mut read_data = Vec::new();
|
let mut read_data = Vec::new();
|
||||||
@ -301,4 +370,17 @@ mod test {
|
|||||||
|
|
||||||
assert_eq!(c.receive().is_err(), true);
|
assert_eq!(c.receive().is_err(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn writes() {
|
||||||
|
test_read_back(&Package::JsonNull);
|
||||||
|
test_read_back(&Package::JsonFalse);
|
||||||
|
test_read_back(&Package::JsonTrue);
|
||||||
|
|
||||||
|
test_read_back(&Package::Json(Command::Pong {}));
|
||||||
|
|
||||||
|
test_read_back(&Package::Error(500, "I bims 1 Error".to_string()));
|
||||||
|
|
||||||
|
test_read_back(&Package::Binary(vec![42u8; 50000]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user