use std::io::{BufRead, BufReader, Write};
use std::net::TcpStream;
use crate::command::{Command, Response};
use crate::error::PixelflutResult;
use crate::Pixel;
pub struct PixelflutServerStream {
reader: BufReader<TcpStream>,
dimensions: (u32, u32),
}
impl PixelflutServerStream {
pub fn new(stream: TcpStream, dimensions: (u32, u32)) -> PixelflutServerStream {
PixelflutServerStream {
reader: BufReader::new(stream),
dimensions,
}
}
fn send_response(&mut self, response: &Response) -> PixelflutResult<()> {
self.reader
.get_mut()
.write_fmt(format_args!("{}\n", response))?;
Ok(())
}
fn read_command(&mut self) -> PixelflutResult<Option<Command>> {
let mut line = String::new();
let _len = match self.reader.read_line(&mut line) {
Ok(n) => n,
Err(e) if e.kind() == std::io::ErrorKind::UnexpectedEof => return Ok(None),
Err(e) => return Err(e.into()),
};
Ok(Some(line[0..line.len()].parse()?))
}
pub fn read_pixel(&mut self) -> PixelflutResult<Option<Pixel>> {
loop {
match self.read_command()? {
Some(Command::Px(pixel)) => return Ok(Some(pixel)),
Some(Command::Size) => self.send_response(&Response::Size {
w: self.dimensions.0,
h: self.dimensions.1,
})?,
None => return Ok(None),
}
}
}
}