diff --git a/src/main.rs b/src/main.rs index ff750ea..00e6194 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,14 @@ mod rest; -use std::sync::atomic::{AtomicU32, Ordering}; +use std::io::stdout; use std::sync::{Arc, Mutex}; use std::time::Duration; -use crossterm::event; +use crossterm::{event, execute}; use crossterm::event::{Event, KeyCode, KeyModifiers}; -use ratatui::{DefaultTerminal, Frame}; +use crossterm::terminal::{enable_raw_mode, EnterAlternateScreen, disable_raw_mode, LeaveAlternateScreen}; +use ratatui::{DefaultTerminal, Frame, Terminal}; +use ratatui::backend::CrosstermBackend; use ratatui::layout::{Alignment, Constraint, Layout, Position}; -use ratatui::prelude::Direction; use ratatui::style::{Color, Style}; use ratatui::text::Line; use ratatui::widgets::{Block, Borders, List, ListItem, ListState, Paragraph, Wrap}; @@ -18,11 +19,32 @@ use tokio::sync::mpsc; #[tokio::main] async fn main() -> color_eyre::Result<()> { color_eyre::install()?; - let mut terminal = ratatui::init(); - let result = App::new().run(&mut terminal); + init_panic_hook(); + + enable_raw_mode()?; + let mut out = stdout(); + execute!(out, EnterAlternateScreen)?; + let backend = CrosstermBackend::new(out); + let mut terminal = Terminal::new(backend)?; + + let _result = App::new().run(&mut terminal); + + disable_raw_mode()?; + execute!(terminal.backend_mut(), LeaveAlternateScreen)?; + terminal.show_cursor()?; + Ok(()) } +fn init_panic_hook() { + let original_hook = std::panic::take_hook(); + std::panic::set_hook(Box::new(move |panic_info| { + let _ = disable_raw_mode(); + let _ = execute!(stdout(), LeaveAlternateScreen); + original_hook(panic_info); + })); +} + pub struct App { input: String, should_quit: bool, @@ -50,6 +72,7 @@ impl App { } fn run(&mut self, terminal: &mut DefaultTerminal) -> std::io::Result<()> { + terminal.clear()?; while !self.should_quit { terminal.draw(|frame| self.render(frame))?; if crossterm::event::poll(Duration::from_millis(500))? { @@ -57,6 +80,9 @@ impl App { } self.drain_replies(); } + terminal.clear()?; + + terminal.set_cursor_position(Position::new(0,0))?; Ok(()) } @@ -64,7 +90,7 @@ impl App { if let Event::Key(key) = event::read()? { match key.code { KeyCode::Char(c) => { - if(key.modifiers == KeyModifiers::CONTROL) + if key.modifiers == KeyModifiers::CONTROL { self.should_quit = true; } @@ -83,18 +109,18 @@ impl App { KeyCode::Up => self.move_view_up(), KeyCode::Down => self.move_view_down(), KeyCode::Enter => { - let strMessage = self.input.clone(); + let str_message = self.input.clone(); - self.push_message(strMessage.clone()); + self.push_message(str_message.clone()); self.reset_cursor(); self.input = String::new(); let message = rest::Message::new( - strMessage.clone(), - "USER".parse().unwrap(), - false, - true, - false, + str_message.clone(), + "USER".parse().unwrap(), + false, + true, + false, ); let tx = self.reply_tx.clone(); @@ -103,7 +129,7 @@ impl App { tokio::spawn(async move { match rest.send(message).await { Ok(reply) => { - if(reply.role == "ASSISTANT") + if reply.role == "ASSISTANT" { let _ = tx.send(reply.message); }