From c18e92ff0166a844e24b0d786e338fc3d670d108 Mon Sep 17 00:00:00 2001 From: uttarayan21 Date: Wed, 8 Oct 2025 14:58:33 +0530 Subject: [PATCH] feat: run the tui --- src/errors.rs | 2 +- src/lib.rs | 3 -- src/main.rs | 8 ++--- src/tui.rs | 84 +++++++++++++++++++++++++++------------------------ 4 files changed, 49 insertions(+), 48 deletions(-) delete mode 100644 src/lib.rs diff --git a/src/errors.rs b/src/errors.rs index 149f933..1870c98 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -1,4 +1,4 @@ -pub use error_stack::{Report, ResultExt}; +// Removed unused imports Report and ResultExt #[derive(Debug, thiserror::Error)] #[error("An error occurred")] pub struct Error; diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index 97cf2ba..0000000 --- a/src/lib.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod errors; -use errors::*; -mod api; diff --git a/src/main.rs b/src/main.rs index f47d767..ccb0c94 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,10 +2,10 @@ mod api; mod cli; mod errors; mod tui; -use errors::*; - use crate::api::SonarrClient; -pub fn main() -> Result<()> { + +#[tokio::main] +pub async fn main() -> Result<(), Box> { // let args = ::parse(); // match args.cmd { // cli::SubCommand::Add(add) => { @@ -23,6 +23,6 @@ pub fn main() -> Result<()> { "https://sonarr.tsuba.darksailor.dev".into(), "1a47401731bf44ae9787dfcd4bab402f".into(), ); - tui::run_app(client); + tui::run_app(client).await?; Ok(()) } diff --git a/src/tui.rs b/src/tui.rs index 74ff5d5..8d6d0d4 100644 --- a/src/tui.rs +++ b/src/tui.rs @@ -7,10 +7,10 @@ use ratatui::{ backend::{Backend, CrosstermBackend}, layout::{Alignment, Constraint, Direction, Layout, Rect}, style::{Color, Modifier, Style}, - text::{Line, Span, Text}, + text::{Line, Span}, widgets::{ - Block, Borders, Cell, Clear, Gauge, List, ListItem, ListState, Paragraph, Row, Table, - TableState, Tabs, Wrap, + Block, Borders, Cell, Clear, List, ListItem, ListState, Paragraph, Row, Table, TableState, + Tabs, Wrap, }, Frame, Terminal, }; @@ -649,8 +649,8 @@ async fn handle_input( } } -fn ui(f: &mut Frame, app: &App) { - let size = f.size(); +fn ui(f: &mut Frame, app: &App) { + let size = f.area(); // Create main layout let chunks = Layout::default() @@ -684,7 +684,7 @@ fn ui(f: &mut Frame, app: &App) { } } -fn render_header(f: &mut Frame, area: Rect, app: &App) { +fn render_header(f: &mut Frame, area: Rect, app: &App) { let tabs = Tabs::new(TabIndex::titles()) .block( Block::default() @@ -702,7 +702,7 @@ fn render_header(f: &mut Frame, area: Rect, app: &App) { f.render_widget(tabs, area); } -fn render_series_tab(f: &mut Frame, area: Rect, app: &App) { +fn render_series_tab(f: &mut Frame, area: Rect, app: &App) { if app.series.is_empty() { let loading_text = if app.loading { "Loading series..." @@ -745,7 +745,7 @@ fn render_series_tab(f: &mut Frame, area: Rect, app: &App) { f.render_stateful_widget(list, area, &mut app.series_list_state.clone()); } -fn render_calendar_tab(f: &mut Frame, area: Rect, app: &App) { +fn render_calendar_tab(f: &mut Frame, area: Rect, app: &App) { if app.calendar.is_empty() { let loading_text = if app.loading { "Loading calendar..." @@ -801,7 +801,7 @@ fn render_calendar_tab(f: &mut Frame, area: Rect, app: &App) { f.render_stateful_widget(list, area, &mut app.episodes_list_state.clone()); } -fn render_queue_tab(f: &mut Frame, area: Rect, app: &App) { +fn render_queue_tab(f: &mut Frame, area: Rect, app: &App) { if app.queue.is_empty() { let loading_text = if app.loading { "Loading queue..." @@ -838,7 +838,7 @@ fn render_queue_tab(f: &mut Frame, area: Rect, app: &App) { Row::new(vec![ Cell::from(title), - Cell::from(status), + Cell::from(status.as_str()), Cell::from(progress), Cell::from(quality), Cell::from(size), @@ -846,30 +846,32 @@ fn render_queue_tab(f: &mut Frame, area: Rect, app: &App) { }) .collect(); - let table = Table::new(rows) - .header(header.style(Style::default().fg(Color::Yellow))) - .block( - Block::default() - .borders(Borders::ALL) - .title("Download Queue"), - ) - .widths(&[ + let table = Table::new( + rows, + &[ Constraint::Percentage(40), Constraint::Percentage(15), Constraint::Percentage(15), Constraint::Percentage(15), Constraint::Percentage(15), - ]) - .highlight_style( - Style::default() - .fg(Color::Yellow) - .add_modifier(Modifier::BOLD), - ); + ], + ) + .header(header.style(Style::default().fg(Color::Yellow))) + .block( + Block::default() + .borders(Borders::ALL) + .title("Download Queue"), + ) + .highlight_style( + Style::default() + .fg(Color::Yellow) + .add_modifier(Modifier::BOLD), + ); f.render_stateful_widget(table, area, &mut app.queue_table_state.clone()); } -fn render_history_tab(f: &mut Frame, area: Rect, app: &App) { +fn render_history_tab(f: &mut Frame, area: Rect, app: &App) { if app.history.is_empty() { let loading_text = if app.loading { "Loading history..." @@ -910,32 +912,34 @@ fn render_history_tab(f: &mut Frame, area: Rect, app: &App) { Cell::from(date), Cell::from(series), Cell::from(episode), - Cell::from(event), + Cell::from(event.as_str()), Cell::from(quality), ]) }) .collect(); - let table = Table::new(rows) - .header(header.style(Style::default().fg(Color::Yellow))) - .block(Block::default().borders(Borders::ALL).title("History")) - .widths(&[ + let table = Table::new( + rows, + &[ Constraint::Percentage(20), Constraint::Percentage(30), Constraint::Percentage(15), Constraint::Percentage(20), Constraint::Percentage(15), - ]) - .highlight_style( - Style::default() - .fg(Color::Yellow) - .add_modifier(Modifier::BOLD), - ); + ], + ) + .header(header.style(Style::default().fg(Color::Yellow))) + .block(Block::default().borders(Borders::ALL).title("History")) + .highlight_style( + Style::default() + .fg(Color::Yellow) + .add_modifier(Modifier::BOLD), + ); f.render_stateful_widget(table, area, &mut app.history_table_state.clone()); } -fn render_health_tab(f: &mut Frame, area: Rect, app: &App) { +fn render_health_tab(f: &mut Frame, area: Rect, app: &App) { if app.health.is_empty() { let loading_text = if app.loading { "Loading health status..." @@ -990,7 +994,7 @@ fn render_health_tab(f: &mut Frame, area: Rect, app: &App) { f.render_stateful_widget(list, area, &mut app.health_list_state.clone()); } -fn render_search_tab(f: &mut Frame, area: Rect, app: &App) { +fn render_search_tab(f: &mut Frame, area: Rect, app: &App) { let chunks = Layout::default() .direction(Direction::Vertical) .constraints([Constraint::Length(3), Constraint::Min(0)]) @@ -1068,7 +1072,7 @@ fn render_search_tab(f: &mut Frame, area: Rect, app: &App) { } } -fn render_footer(f: &mut Frame, area: Rect, app: &App) { +fn render_footer(f: &mut Frame, area: Rect, app: &App) { let help_text = if app.input_mode { "ESC: Cancel | Enter: Search | Type to enter search term" } else { @@ -1100,7 +1104,7 @@ fn render_footer(f: &mut Frame, area: Rect, app: &App) { f.render_widget(paragraph, area); } -fn render_error_popup(f: &mut Frame, area: Rect, app: &App) { +fn render_error_popup(f: &mut Frame, area: Rect, app: &App) { if let Some(error) = &app.error_message { let popup_area = centered_rect(60, 20, area);