rust/lib-hedgewars-engine/src/ipc.rs
changeset 14260 f0c0d2d217c3
parent 14255 a239e4243cf9
child 14261 1b8c889027a3
equal deleted inserted replaced
14259:7d7f7483459e 14260:f0c0d2d217c3
     1 use hedgewars_engine_messages::{messages::*, parser};
     1 use hedgewars_engine_messages::{messages::*, parser::extract_message};
     2 use netbuf::*;
     2 use netbuf::*;
       
     3 use std::io::*;
     3 
     4 
     4 pub struct IPC {
     5 pub struct IPC {
     5     in_buffer: Buf,
     6     in_buffer: Buf,
     6     out_buffer: Buf,
     7     out_buffer: Buf,
     7 }
     8 }
     8 
     9 
     9 impl IPC {
    10 impl IPC {
    10     pub fn new() -> Self {
    11     pub fn new() -> Self {
       
    12         Self {
       
    13             in_buffer: Buf::new(),
       
    14             out_buffer: Buf::new(),
       
    15         }
       
    16     }
    11 
    17 
       
    18     pub fn send_message(&mut self, message: &EngineMessage) {
       
    19         self.out_buffer.write(&message.to_bytes()).unwrap();
    12     }
    20     }
    13 }
    21 }
       
    22 
       
    23 impl Write for IPC {
       
    24     fn write(&mut self, buf: &[u8]) -> Result<usize> {
       
    25         self.in_buffer.write(buf)
       
    26     }
       
    27 
       
    28     fn flush(&mut self) -> Result<()> {
       
    29         self.in_buffer.flush()
       
    30     }
       
    31 }
       
    32 
       
    33 impl Read for IPC {
       
    34     fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
       
    35         let result = self.out_buffer.as_ref().read(buf);
       
    36 
       
    37         if let Ok(read_bytes) = result {
       
    38             self.out_buffer.consume(read_bytes);
       
    39         }
       
    40 
       
    41         result
       
    42     }
       
    43 }
       
    44 
       
    45 impl Iterator for IPC {
       
    46     type Item = EngineMessage;
       
    47 
       
    48     fn next(&mut self) -> Option<Self::Item> {
       
    49         let (consumed, message) = extract_message(&self.in_buffer[..])?;
       
    50 
       
    51         self.in_buffer.consume(consumed);
       
    52 
       
    53         Some(message)
       
    54     }
       
    55 }