poddy/
lib.rs

1pub mod app;
2pub mod input;
3pub mod k8s;
4
5mod client;
6
7use crate::app::{ui, AppReturn};
8use crate::input::events::Events;
9use crate::input::InputEvent;
10use app::App;
11use clap::Parser;
12use std::io::stdout;
13use std::sync::Arc;
14use std::time::Duration;
15use tui::backend::CrosstermBackend;
16use tui::Terminal;
17
18/// Watch pods
19#[derive(Parser, Debug, Clone)]
20#[clap(author, version, about, long_about = None)]
21pub struct Args {
22    /// Namespace
23    #[clap(short, long, value_parser)]
24    pub namespace: Option<String>,
25    /// Verbose
26    #[clap(short, long, action = clap::ArgAction::Count)]
27    pub verbose: u8,
28}
29
30pub async fn start_ui(app: &Arc<tokio::sync::Mutex<App>>) -> anyhow::Result<()> {
31    // Configure Crossterm backend for tui
32    let stdout = stdout();
33    crossterm::terminal::enable_raw_mode()?;
34    let backend = CrosstermBackend::new(stdout);
35    let mut terminal = Terminal::new(backend)?;
36    terminal.clear()?;
37    terminal.hide_cursor()?;
38
39    let render_rate = Duration::from_millis(200);
40    let mut events = Events::new(render_rate);
41
42    loop {
43        // Handle inputs
44
45        let event = events.next().await;
46        {
47            let mut app = app.lock().await;
48            match event {
49                InputEvent::Input(key) => {
50                    if let AppReturn::Exit = app.do_action(key).await {
51                        break;
52                    }
53                }
54                InputEvent::Render => {}
55                InputEvent::Quit => {
56                    break;
57                }
58            }
59            // always render after a change
60            terminal.draw(|rect| ui::draw(rect, &app))?;
61        }
62    }
63
64    // Restore the terminal and close application
65    terminal.clear()?;
66    terminal.show_cursor()?;
67    crossterm::terminal::disable_raw_mode()?;
68
69    Ok(())
70}