Outgoing and Incoming Messages
This commit is contained in:
parent
cf55f3ea7e
commit
f5cc02b78b
1 changed files with 38 additions and 3 deletions
41
src/main.rs
41
src/main.rs
|
|
@ -11,6 +11,7 @@ use cli::Cli;
|
||||||
use ratatui::{
|
use ratatui::{
|
||||||
crossterm::event::{self, KeyCode},
|
crossterm::event::{self, KeyCode},
|
||||||
layout::{Constraint, Direction, Layout},
|
layout::{Constraint, Direction, Layout},
|
||||||
|
style::{Color, Style},
|
||||||
text::{Line, Span},
|
text::{Line, Span},
|
||||||
widgets::{Block, Borders, Paragraph, Widget},
|
widgets::{Block, Borders, Paragraph, Widget},
|
||||||
};
|
};
|
||||||
|
|
@ -22,6 +23,15 @@ fn make_textarea<'a>() -> TextArea<'a> {
|
||||||
ta
|
ta
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum MessageType {
|
||||||
|
Outgoing,
|
||||||
|
Incoming,
|
||||||
|
}
|
||||||
|
struct Message {
|
||||||
|
content: String,
|
||||||
|
message_type: MessageType,
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let args = Cli::parse();
|
let args = Cli::parse();
|
||||||
|
|
||||||
|
|
@ -37,25 +47,42 @@ fn main() {
|
||||||
};
|
};
|
||||||
|
|
||||||
let (tx_send_msg, rx_send_msg) = std::sync::mpsc::channel::<String>();
|
let (tx_send_msg, rx_send_msg) = std::sync::mpsc::channel::<String>();
|
||||||
let (tx_read_msg, rx_read_msg) = std::sync::mpsc::channel::<String>();
|
let (tx_read_msg, rx_read_msg) = std::sync::mpsc::channel::<Message>();
|
||||||
|
|
||||||
let listener_thread = {
|
let listener_thread = {
|
||||||
let mut reader = BufReader::new(stream.try_clone().unwrap());
|
let mut reader = BufReader::new(stream.try_clone().unwrap());
|
||||||
|
let tx_read_msg = tx_read_msg.clone();
|
||||||
std::thread::spawn(move || {
|
std::thread::spawn(move || {
|
||||||
loop {
|
loop {
|
||||||
let mut r = String::new();
|
let mut r = String::new();
|
||||||
reader.read_line(&mut r).unwrap();
|
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 writer_thread = {
|
||||||
|
let tx_read_msg = tx_read_msg.clone();
|
||||||
std::thread::spawn(move || {
|
std::thread::spawn(move || {
|
||||||
loop {
|
loop {
|
||||||
let input = rx_send_msg.recv().unwrap();
|
let input = rx_send_msg.recv().unwrap();
|
||||||
|
|
||||||
|
let msg_content = format!("{}\n", input);
|
||||||
|
|
||||||
stream.write_all(input.as_bytes()).unwrap();
|
stream.write_all(input.as_bytes()).unwrap();
|
||||||
stream.write_all(b"\n").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(
|
Paragraph::new(
|
||||||
messages
|
messages
|
||||||
.iter()
|
.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::<Vec<_>>(),
|
.collect::<Vec<_>>(),
|
||||||
),
|
),
|
||||||
top,
|
top,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue