diff --git a/src/bin/syzctl.rs b/src/bin/syzctl.rs index 71879ee..58c5185 100644 --- a/src/bin/syzctl.rs +++ b/src/bin/syzctl.rs @@ -1,100 +1,15 @@ -use anyhow::Result; use clap::Parser; -use crossterm::{ - event::{self, Event, KeyCode}, - execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, -}; -use ratatui::{ - prelude::*, - widgets::{Block, Borders, Paragraph}, -}; -use std::io; +use syz::tui::run; #[derive(Parser, Debug)] #[command(author, version, about, long_about = None)] struct Args { - /// Some argument placeholder #[arg(short, long)] - example: Option, + todo: Option, } -fn main() -> Result<()> { +fn main() -> anyhow::Result<()> { let _args = Args::parse(); - // Setup terminal - enable_raw_mode()?; - let mut stdout = io::stdout(); - execute!(stdout, EnterAlternateScreen)?; - let backend = CrosstermBackend::new(stdout); - let mut terminal = Terminal::new(backend)?; - - // Main loop - let res = run_app(&mut terminal); - - // Restore terminal - disable_raw_mode()?; - execute!(terminal.backend_mut(), LeaveAlternateScreen)?; - terminal.show_cursor()?; - - if let Err(err) = res { - eprintln!("{:?}", err); - } - - Ok(()) -} - -fn run_app(terminal: &mut Terminal) -> Result<()> { - loop { - terminal.draw(|f| ui(f))?; - - if let Event::Key(key) = event::read()? { - match key.code { - KeyCode::Char('q') => return Ok(()), - _ => {} - } - } - } -} - -fn ui(f: &mut Frame) { - let area = f.area(); - - // Create a centered layout - let chunks = Layout::default() - .direction(Direction::Vertical) - .constraints([ - Constraint::Length(1), - Constraint::Min(0), - Constraint::Length(1), - ]) - .split(area); - - let content_area = chunks[1]; - - let centered_chunks = Layout::default() - .direction(Direction::Horizontal) - .constraints([ - Constraint::Percentage(40), - Constraint::Percentage(20), - Constraint::Percentage(40), - ]) - .split(content_area); - - let vertical_chunks = Layout::default() - .direction(Direction::Vertical) - .constraints([ - Constraint::Percentage(40), - Constraint::Percentage(20), - Constraint::Percentage(40), - ]) - .split(centered_chunks[1]); - - let final_area = vertical_chunks[1]; - - let block = Block::default().borders(Borders::ALL).title(" syzctl "); - - let paragraph = Paragraph::new("syzctl").block(block); - - f.render_widget(paragraph, final_area); + run() } diff --git a/src/lib.rs b/src/lib.rs index 39b0aaa..44a53f8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,2 +1,3 @@ pub mod core; pub mod server; +pub mod tui; diff --git a/src/tui/mod.rs b/src/tui/mod.rs new file mode 100644 index 0000000..c48d061 --- /dev/null +++ b/src/tui/mod.rs @@ -0,0 +1,91 @@ +use anyhow::Result; +use crossterm::{ + event::{self, Event, KeyCode}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, +}; +use ratatui::{ + backend::CrosstermBackend, + prelude::*, + widgets::{Block, Borders, Paragraph}, +}; +use std::io; + +pub fn run() -> Result<()> { + // Setup terminal + enable_raw_mode()?; + let mut stdout = io::stdout(); + execute!(stdout, EnterAlternateScreen)?; + let backend = CrosstermBackend::new(stdout); + let mut terminal = Terminal::new(backend)?; + + // Main loop + let res = run_app(&mut terminal); + + // Restore terminal + disable_raw_mode()?; + execute!(terminal.backend_mut(), LeaveAlternateScreen)?; + terminal.show_cursor()?; + + if let Err(err) = res { + eprintln!("{:?}", err); + } + + Ok(()) +} + +fn run_app(terminal: &mut Terminal) -> Result<()> { + loop { + terminal.draw(|f| ui(f))?; + + if let Event::Key(key) = event::read()? { + match key.code { + KeyCode::Char('q') => return Ok(()), + KeyCode::Esc => return Ok(()), + _ => {} + } + } + } +} + +fn ui(f: &mut Frame) { + let area = f.area(); + + // Create a centered layout + let chunks = Layout::default() + .direction(Direction::Vertical) + .constraints([ + Constraint::Length(1), + Constraint::Min(0), + Constraint::Length(1), + ]) + .split(area); + + let content_area = chunks[1]; + + let centered_chunks = Layout::default() + .direction(Direction::Horizontal) + .constraints([ + Constraint::Percentage(40), + Constraint::Percentage(20), + Constraint::Percentage(40), + ]) + .split(content_area); + + let vertical_chunks = Layout::default() + .direction(Direction::Vertical) + .constraints([ + Constraint::Percentage(40), + Constraint::Percentage(20), + Constraint::Percentage(40), + ]) + .split(centered_chunks[1]); + + let final_area = vertical_chunks[1]; + + let block = Block::default().borders(Borders::ALL).title(" syzctl "); + + let paragraph = Paragraph::new("syzctl").block(block); + + f.render_widget(paragraph, final_area); +}