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