zilliz 1.2.1

TUI and CLI tool for managing Zilliz Cloud clusters and Milvus operations
Documentation
pub mod app;
pub mod event;
pub mod handler;
pub mod render;
pub mod views;
pub mod widgets;

use anyhow::Result;
use crossterm::{
    event::{DisableMouseCapture, EnableMouseCapture},
    execute,
    terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
};
use ratatui::prelude::*;

use crate::config::manager::ConfigManager;
use crate::model::loader::Models;

use self::app::App;
use self::event::{Event, EventLoop};

/// Main entry point for TUI mode.
pub async fn run(models: Models, config_mgr: ConfigManager) -> Result<()> {
    enable_raw_mode()?;
    let mut stdout = std::io::stdout();
    execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?;
    let backend = CrosstermBackend::new(stdout);
    let mut terminal = Terminal::new(backend)?;

    let mut app = App::new(models, config_mgr);
    let event_loop = EventLoop::new(250);

    let result = run_loop(&mut terminal, &mut app, &event_loop);

    disable_raw_mode()?;
    execute!(
        terminal.backend_mut(),
        LeaveAlternateScreen,
        DisableMouseCapture
    )?;
    terminal.show_cursor()?;

    result
}

fn run_loop(
    terminal: &mut Terminal<CrosstermBackend<std::io::Stdout>>,
    app: &mut App,
    event_loop: &EventLoop,
) -> Result<()> {
    loop {
        terminal.draw(|frame| render::render(frame, app))?;

        match event_loop.next()? {
            Event::Key(key) => {
                handler::handle_key(app, key);
            }
            Event::Tick | Event::Resize(_, _) => {}
        }

        if app.should_quit {
            break;
        }
    }

    Ok(())
}