diff --git a/src/main.rs b/src/main.rs index 6744c8a..81ae4b9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,7 @@ use cli::Cli; use ratatui::{ crossterm::event::{self, KeyCode}, layout::{Constraint, Direction, Layout}, + style::{Color, Style}, text::{Line, Span}, widgets::{Block, Borders, Paragraph, Widget}, }; @@ -22,6 +23,15 @@ fn make_textarea<'a>() -> TextArea<'a> { ta } +enum MessageType { + Outgoing, + Incoming, +} +struct Message { + content: String, + message_type: MessageType, +} + fn main() { let args = Cli::parse(); @@ -37,25 +47,42 @@ fn main() { }; let (tx_send_msg, rx_send_msg) = std::sync::mpsc::channel::(); - let (tx_read_msg, rx_read_msg) = std::sync::mpsc::channel::(); + let (tx_read_msg, rx_read_msg) = std::sync::mpsc::channel::(); let listener_thread = { let mut reader = BufReader::new(stream.try_clone().unwrap()); + let tx_read_msg = tx_read_msg.clone(); std::thread::spawn(move || { loop { let mut r = String::new(); reader.read_line(&mut r).unwrap(); - tx_read_msg.send(r).unwrap(); + tx_read_msg + .send(Message { + content: r, + message_type: MessageType::Incoming, + }) + .unwrap(); } }) }; let writer_thread = { + let tx_read_msg = tx_read_msg.clone(); std::thread::spawn(move || { loop { let input = rx_send_msg.recv().unwrap(); + + let msg_content = format!("{}\n", input); + stream.write_all(input.as_bytes()).unwrap(); stream.write_all(b"\n").unwrap(); + + tx_read_msg + .send(Message { + content: msg_content, + message_type: MessageType::Outgoing, + }) + .unwrap(); } }) }; @@ -88,7 +115,15 @@ fn main() { Paragraph::new( messages .iter() - .map(|it| Line::from(it.clone())) + .map(|it| match it.message_type { + MessageType::Outgoing => { + Line::from(format!("> {}", it.content)) + .style(Style::default().fg(Color::DarkGray)) + } + MessageType::Incoming => { + Line::from(it.content.clone()).style(Style::default()) + } + }) .collect::>(), ), top,