terminal-chat
32 строки · 914.0 Байт
1use std::{io::{BufReader, self, BufRead, Error, ErrorKind}, self, net::TcpStream};
2
3use crate::types::SignalHeader;
4
5pub trait StreamReader {
6fn read_signal(&mut self) -> io::Result<String>;
7}
8
9impl StreamReader for BufReader<TcpStream> {
10fn read_signal(&mut self) -> io::Result<String> {
11let mut res_line = String::new();
12let mut headers_read = false;
13loop {
14let mut buf_line = String::new();
15match self.read_line(&mut buf_line) {
16Err(_) => return Err(Error::new(ErrorKind::ConnectionAborted, "boom boom")),
17Ok(0) => return Err(Error::new(ErrorKind::BrokenPipe, "boom boom")),
18Ok(m) => m,
19};
20res_line.push_str(&buf_line);
21
22if res_line.ends_with("\r\n\r\n"){
23if !res_line.contains(&SignalHeader::WithMessage.to_string()) || headers_read {
24break;
25}
26headers_read = true;
27}
28}
29
30Ok(res_line)
31}
32}