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#[derive(Parser, Debug, Clone)]
20#[clap(author, version, about, long_about = None)]
21pub struct Args {
22 #[clap(short, long, value_parser)]
24 pub namespace: Option<String>,
25 #[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 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 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 terminal.draw(|rect| ui::draw(rect, &app))?;
61 }
62 }
63
64 terminal.clear()?;
66 terminal.show_cursor()?;
67 crossterm::terminal::disable_raw_mode()?;
68
69 Ok(())
70}