use bufstream::BufStream;
use std::io::{self, BufRead, Write};
use std::net::{TcpStream, ToSocketAddrs};
use crate::command::{Command, Response};
use crate::error::PixelflutErrorKind;
use crate::pixel::Pixel;
use crate::{Color, PixelflutResult};
pub struct PixelflutClient {
stream: BufStream<TcpStream>,
}
impl PixelflutClient {
pub fn connect(addr: impl ToSocketAddrs) -> PixelflutResult<PixelflutClient> {
let stream = TcpStream::connect(addr)?;
Ok(PixelflutClient {
stream: BufStream::new(stream),
})
}
pub fn dimensions(&mut self) -> PixelflutResult<(u32, u32)> {
self.stream.write_fmt(format_args!("{}\n", Command::Size))?;
self.stream.flush()?;
let mut line = String::new();
let n = self.stream.read_line(&mut line)?;
if n > 0 {
let response: Response = line[0..n - 1].parse()?;
match response {
Response::Size { w, h } => Ok((w, h)),
Response::Error(_err) => Err(PixelflutErrorKind::ServerError.into()),
}
} else {
Err(io::Error::new(io::ErrorKind::UnexpectedEof, "expected size").into())
}
}
pub fn set(&mut self, x: u32, y: u32, color: impl Into<Color>) -> PixelflutResult<()> {
let pixel = Pixel::new((x, y).into(), color.into());
self.stream
.write_fmt(format_args!("{}\n", Command::Px(pixel)))?;
Ok(())
}
pub fn flush(&mut self) -> PixelflutResult<()> {
self.stream.flush()?;
Ok(())
}
}