Added so it runs in a sepeat screen to not break my terminal
This commit is contained in:
+41
-15
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user