diff -r 7515ae6010bb -r 07e909ba4203 rust/lib-hedgewars-engine/src/ipc/channel.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/lib-hedgewars-engine/src/ipc/channel.rs Thu Jul 25 15:18:00 2019 +0200 @@ -0,0 +1,67 @@ +use hedgewars_engine_messages::{messages::*, parser::extract_message}; +use netbuf::*; +use std::io::*; + +pub struct Channel { + in_buffer: Buf, + out_buffer: Buf, +} + +impl Channel { + 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(); + } + + pub fn iter(&mut self) -> IPCMessagesIterator { + IPCMessagesIterator::new(self) + } +} + +impl Write for Channel { + fn write(&mut self, buf: &[u8]) -> Result { + self.in_buffer.write(buf) + } + + fn flush(&mut self) -> Result<()> { + self.in_buffer.flush() + } +} + +impl Read for Channel { + fn read(&mut self, buf: &mut [u8]) -> Result { + let read_bytes = self.out_buffer.as_ref().read(buf)?; + + self.out_buffer.consume(read_bytes); + + Ok(read_bytes) + } +} + +pub struct IPCMessagesIterator<'a> { + ipc: &'a mut Channel, +} + +impl<'a> IPCMessagesIterator<'a> { + pub fn new(ipc: &'a mut Channel) -> Self { + Self { ipc } + } +} + +impl<'a> Iterator for IPCMessagesIterator<'a> { + type Item = EngineMessage; + + fn next(&mut self) -> Option { + let (consumed, message) = extract_message(&self.ipc.in_buffer[..])?; + + self.ipc.in_buffer.consume(consumed); + + Some(message) + } +}