// mod configuration; mod lyrics_engine; mod sources; use std::io::{Result, Error, ErrorKind::Other}; use clap::{Parser}; 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 arguments = Arguments::parse(); if arguments.list_sources { return list(); } if let Some(source_name) = arguments.enable_source { return enable(source_name); } if let Some(source_name) = arguments.disable_source { return disable(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 }