diff -r 7d7f7483459e -r f0c0d2d217c3 rust/lib-hedgewars-engine/src/ipc.rs --- a/rust/lib-hedgewars-engine/src/ipc.rs Wed Nov 21 17:28:28 2018 +0300 +++ b/rust/lib-hedgewars-engine/src/ipc.rs Wed Nov 21 15:49:16 2018 +0100 @@ -1,5 +1,6 @@ -use hedgewars_engine_messages::{messages::*, parser}; +use hedgewars_engine_messages::{messages::*, parser::extract_message}; use netbuf::*; +use std::io::*; pub struct IPC { in_buffer: Buf, @@ -8,6 +9,47 @@ impl IPC { pub fn new() -> Self { + Self { + in_buffer: Buf::new(), + out_buffer: Buf::new(), + } + } + pub fn send_message(&mut self, message: &EngineMessage) { + self.out_buffer.write(&message.to_bytes()).unwrap(); + } +} + +impl Write for IPC { + fn write(&mut self, buf: &[u8]) -> Result { + self.in_buffer.write(buf) + } + + fn flush(&mut self) -> Result<()> { + self.in_buffer.flush() } } + +impl Read for IPC { + fn read(&mut self, buf: &mut [u8]) -> Result { + let result = self.out_buffer.as_ref().read(buf); + + if let Ok(read_bytes) = result { + self.out_buffer.consume(read_bytes); + } + + result + } +} + +impl Iterator for IPC { + type Item = EngineMessage; + + fn next(&mut self) -> Option { + let (consumed, message) = extract_message(&self.in_buffer[..])?; + + self.in_buffer.consume(consumed); + + Some(message) + } +}