mod action;
mod app;
mod audio;
mod event;
mod favorites;
mod radio;
mod ui;
use std::time::Duration;
use anyhow::Result;
use app::App;
use favorites::Library;
use radio::fallback_stations;
#[tokio::main]
async fn main() -> Result<()> {
let library = Library::load(fallback_stations());
let saved_theme = ui::theme::ThemeName::from_key(&library.settings.theme);
ui::theme::set_active(saved_theme);
let mut app = App::new(library);
let mut terminal = ratatui::init();
let (search_tx, mut search_rx) =
tokio::sync::mpsc::unbounded_channel::<Vec<radio::Station>>();
let tick_rate = Duration::from_millis(66);
loop {
terminal.draw(|frame| ui::draw(frame, &app))?;
if let Some(action) = event::poll_action(tick_rate, &app.input_mode) {
app.update(action);
} else {
app.update(action::Action::Tick);
}
if let Some(query) = app.pending_api_search.take() {
let tx = search_tx.clone();
tokio::spawn(async move {
if let Ok(results) = radio::search_stations(&query).await {
let _ = tx.send(results);
}
});
}
if let Ok(results) = search_rx.try_recv() {
app.set_search_results(results);
}
if app.should_quit {
break;
}
}
ratatui::restore();
Ok(())
}