tunein-cli 0.4.2

Browse and listen to thousands of radio stations across the globe right from your terminal 🌎 📻 🎵✨
use anyhow::Error;
use owo_colors::OwoColorize;

use crate::provider::radiobrowser::Radiobrowser;
use crate::provider::tunein::Tunein;
use crate::provider::Provider;

pub async fn exec(
    category: Option<&str>,
    offset: u32,
    limit: u32,
    provider: &str,
) -> Result<(), Error> {
    let provider: Box<dyn Provider> = match provider {
        "tunein" => Box::new(Tunein::new()),
        "radiobrowser" => Box::new(Radiobrowser::new().await),
        _ => {
            return Err(anyhow::anyhow!(format!(
                "Unsupported provider '{}'",
                provider
            )))
        }
    };

    match category {
        Some(category) => {
            let results = provider.browse(category.to_string(), offset, limit).await?;
            for result in results {
                match result.id.is_empty() {
                    false => match result.playing {
                        Some(playing) => println!(
                            "  {} | {} | id: {}",
                            result.name.magenta(),
                            playing,
                            result.id
                        ),
                        None => println!("  {} | id: {}", result.name.magenta(), result.id),
                    },

                    true => println!("{}", result.name),
                }
            }
        }
        None => {
            let results = provider.categories(offset, limit).await?;
            for result in results {
                println!("{}", result.magenta());
            }
        }
    };
    Ok(())
}