use std::io::{BufReader, BufWriter, Error};
use std::net::TcpListener;
use crate::application::application::ApplicationConfig;
use crate::net::tcp_reader::{TcpReader, TcpReaderImpl};
use crate::net::tcp_writer::{TcpWriter, TcpWriterImpl};
pub struct TcpServerImpl {
port: i16,
ip: String,
listener: Option<TcpListener>,
}
pub trait TcpServer {
fn bind(&mut self) -> ();
fn get_tcp_stream(&self) -> Result<(Box<dyn TcpWriter>, Box<dyn TcpReader>), Error>;
}
impl TcpServerImpl {
pub fn from_application(app: ApplicationConfig) -> Self {
Self::new(app.port, Option::from(app.ip))
}
pub fn new(port: i16, ip: Option<String>) -> Self {
Self {
port,
ip: ip.unwrap_or(String::from("[::]")),
listener: None,
}
}
}
impl TcpServer for TcpServerImpl {
fn bind(&mut self) -> () {
self.listener = Option::from(TcpListener::bind(format!("{}:{}", self.ip, self.port)).unwrap());
}
fn get_tcp_stream(&self) -> Result<(Box<dyn TcpWriter>, Box<dyn TcpReader>), Error> {
let listener = self.listener.as_ref().unwrap();
let client = listener.accept()?;
let tcp_stream = client.0;
let stream_copy = tcp_stream.try_clone().expect("Could not copy TcpStream for Reader");
let buf_reader = BufReader::new(stream_copy);
let buf_writer = BufWriter::new(tcp_stream);
Ok((
Box::new(TcpWriterImpl::new(buf_writer)),
Box::new(TcpReaderImpl::new(buf_reader))
))
}
}