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;
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,14 +109,14 @@ 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(),
str_message.clone(),
"USER".parse().unwrap(),
false,
true,
@@ -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);
}