--- /dev/null
+// 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<String>,
+
+ /// Specify the artist.
+ track_name: Option<String>,
+
+ /// 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<String>,
+
+ #[arg(short, long, value_name = "SOURCE")]
+ disable_source: Option<String>,
+
+ #[arg(short, long, value_name = "SOURCE")]
+ reset_source: Option<String>,
+}
+
+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
+}