mod app;
mod event;
pub mod export;
mod screens;
mod theme;
mod widgets;
use app::App;
pub use app::{Candidate, GgufPickerData, State};
use color_eyre::eyre::{Ok, Result};
use crossterm::terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen};
use crossterm::ExecutableCommand;
use ratatui::backend::CrosstermBackend;
use ratatui::Terminal;
use std::io::stdout;
use std::path::PathBuf;
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum Screen {
Dashboard,
Doctor,
Check,
GgufPicker,
Gather,
ThemePicker,
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct TuiOptions {
pub database_path: Option<PathBuf>,
pub no_local_database: bool,
pub offline: bool,
}
pub fn run(initial_screen: Screen) -> Result<()> {
run_with(initial_screen, None).map(|_| ())
}
pub fn run_with(initial_screen: Screen, initial_state: Option<State<GgufPickerData>>) -> Result<Option<String>> {
run_with_options(initial_screen, initial_state, TuiOptions::default())
}
pub fn run_with_options(initial_screen: Screen, initial_state: Option<State<GgufPickerData>>, options: TuiOptions) -> Result<Option<String>> {
enable_raw_mode()?;
let mut stdout = stdout();
stdout.execute(EnterAlternateScreen)?;
let backend = CrosstermBackend::new(stdout);
let mut terminal = Terminal::new(backend)?;
terminal.clear()?;
let mut app = App::with_options(initial_screen, options);
if let Some(state) = initial_state {
app.set_gguf_picker(state);
}
let result = app.run(&mut terminal);
disable_raw_mode()?;
terminal.backend_mut().execute(LeaveAlternateScreen)?;
terminal.show_cursor()?;
result?;
Ok(app.take_gguf_picker_result())
}