use std::net::{TcpStream, TcpListener};
use std::io::{BufReader, BufRead};
use std::sync::{Mutex, Arc, Condvar};
use super::StateMutex;
pub fn listen(addr : String, port : String, state : StateMutex, new_intent_available : Arc<(Mutex<bool>, Condvar)>) -> std::io::Result<()> {
let listener = TcpListener::bind(format!("{}:{}",addr, port))?;
for stream in listener.incoming().take(1) { handle_client(stream?, Arc::clone(&state), Arc::clone(&new_intent_available))?;
}
Ok(())
}
fn handle_client(stream : TcpStream, state : StateMutex, new_intent_available : Arc<(Mutex<bool>, Condvar)>) -> std::io::Result<()> {
let mut buffer = "".to_owned();
let reader = BufReader::new(stream);
for l in reader.lines() { buffer.pop();
if let Ok(mut state) = state.lock() {
state.current_intent = l.unwrap().clone();
state.new_intent = true;
}
let (lock, cvar) = &*new_intent_available;
if let Ok(mut new_intent) = lock.lock() {
*new_intent = true;
cvar.notify_one();
}
buffer.clear();
}
std::process::exit(1);
}