Added so it runs in a sepeat screen to not break my terminal

This commit is contained in:
2026-07-25 12:47:54 +02:00
parent 731c1fa34b
commit 4d0114c7a4
+37 -11
View File
@@ -1,13 +1,14 @@
mod rest; mod rest;
use std::sync::atomic::{AtomicU32, Ordering}; use std::io::stdout;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::time::Duration; use std::time::Duration;
use crossterm::event; use crossterm::{event, execute};
use crossterm::event::{Event, KeyCode, KeyModifiers}; 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::layout::{Alignment, Constraint, Layout, Position};
use ratatui::prelude::Direction;
use ratatui::style::{Color, Style}; use ratatui::style::{Color, Style};
use ratatui::text::Line; use ratatui::text::Line;
use ratatui::widgets::{Block, Borders, List, ListItem, ListState, Paragraph, Wrap}; use ratatui::widgets::{Block, Borders, List, ListItem, ListState, Paragraph, Wrap};
@@ -18,11 +19,32 @@ use tokio::sync::mpsc;
#[tokio::main] #[tokio::main]
async fn main() -> color_eyre::Result<()> { async fn main() -> color_eyre::Result<()> {
color_eyre::install()?; color_eyre::install()?;
let mut terminal = ratatui::init(); init_panic_hook();
let result = App::new().run(&mut terminal);
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(()) 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 { pub struct App {
input: String, input: String,
should_quit: bool, should_quit: bool,
@@ -50,6 +72,7 @@ impl App {
} }
fn run(&mut self, terminal: &mut DefaultTerminal) -> std::io::Result<()> { fn run(&mut self, terminal: &mut DefaultTerminal) -> std::io::Result<()> {
terminal.clear()?;
while !self.should_quit { while !self.should_quit {
terminal.draw(|frame| self.render(frame))?; terminal.draw(|frame| self.render(frame))?;
if crossterm::event::poll(Duration::from_millis(500))? { if crossterm::event::poll(Duration::from_millis(500))? {
@@ -57,6 +80,9 @@ impl App {
} }
self.drain_replies(); self.drain_replies();
} }
terminal.clear()?;
terminal.set_cursor_position(Position::new(0,0))?;
Ok(()) Ok(())
} }
@@ -64,7 +90,7 @@ impl App {
if let Event::Key(key) = event::read()? { if let Event::Key(key) = event::read()? {
match key.code { match key.code {
KeyCode::Char(c) => { KeyCode::Char(c) => {
if(key.modifiers == KeyModifiers::CONTROL) if key.modifiers == KeyModifiers::CONTROL
{ {
self.should_quit = true; self.should_quit = true;
} }
@@ -83,14 +109,14 @@ impl App {
KeyCode::Up => self.move_view_up(), KeyCode::Up => self.move_view_up(),
KeyCode::Down => self.move_view_down(), KeyCode::Down => self.move_view_down(),
KeyCode::Enter => { 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.reset_cursor();
self.input = String::new(); self.input = String::new();
let message = rest::Message::new( let message = rest::Message::new(
strMessage.clone(), str_message.clone(),
"USER".parse().unwrap(), "USER".parse().unwrap(),
false, false,
true, true,
@@ -103,7 +129,7 @@ impl App {
tokio::spawn(async move { tokio::spawn(async move {
match rest.send(message).await { match rest.send(message).await {
Ok(reply) => { Ok(reply) => {
if(reply.role == "ASSISTANT") if reply.role == "ASSISTANT"
{ {
let _ = tx.send(reply.message); let _ = tx.send(reply.message);
} }