mod configuration; mod lyrics_engine; mod sources; use std::io::{Result, Error, ErrorKind::Other}; use clap::Parser; use configuration::Configuration; use sources::{enable, disable, get_track, reset, list}; use lyrics_engine::print_lyrics; #[derive(Parser, Debug)] #[command(version, about, long_about = None)] struct Arguments { // Positional Arguments /// Specify the artist. artist: Option, /// Specify the artist. track_name: Option, /// Show title of track if present #[arg(short = 't', long)] show_title: bool, /// Lists all sources #[arg(short, long)] list_sources: bool, /// Enables a source #[arg(short, long, value_name = "SOURCE")] enable_source: Option, #[arg(short, long, value_name = "SOURCE")] disable_source: Option, #[arg(short, long, value_name = "SOURCE")] reset_source: Option, } pub struct Track { pub name: String, pub artist: String } #[tokio::main] async fn main() -> Result<()> { let result = run().await; if cfg!(debug_assertions) { result } else { match result { Ok(_) => Ok(()), Err(e) => { eprintln!("Error: {}", e); std::process::exit(1); } } } } async fn run() -> Result<()> { let mut configuration = Configuration::new(); let arguments = Arguments::parse(); if arguments.list_sources { let sources = list(); for source in sources { print!("{}", source); if configuration.is_enabled(&source) { print!(" (enabled)"); } println!(""); } return Ok(()); } if let Some(source_name) = arguments.enable_source { if !configuration.is_enabled(&source_name) { enable(&source_name)?; } return configuration.enable_source(&source_name); } if let Some(source_name) = arguments.disable_source { if configuration.is_enabled(&source_name) { disable(&source_name)?; } return configuration.disable_source(&source_name); } if let Some(source_name) = arguments.reset_source { return reset(&source_name); } let current_track: Track; if let Some(artist) = arguments.artist { current_track = Track { name: arguments.track_name.unwrap_or("".to_string()), artist: artist }; } else { current_track = get_track() .ok_or_else(|| Error::new(Other, "No Artist/Song could be found :("))? } print_lyrics(current_track, arguments.show_title).await }