From a0a313996428b598e83016c97adeacd08ad42628 Mon Sep 17 00:00:00 2001 From: krolxon Date: Mon, 22 Apr 2024 16:04:32 +0530 Subject: [PATCH] use subcommands instead of options --- src/cli.rs | 43 +++++++++++++++++++++++++++++++++++++ src/connection.rs | 23 ++++++++++---------- src/main.rs | 54 +++++++++++------------------------------------ 3 files changed, 67 insertions(+), 53 deletions(-) create mode 100755 src/cli.rs diff --git a/src/cli.rs b/src/cli.rs new file mode 100755 index 0000000..f1d648c --- /dev/null +++ b/src/cli.rs @@ -0,0 +1,43 @@ +use clap::{Parser, Subcommand}; +#[derive(Parser, Debug)] +#[command(version, about)] +#[clap(author = "krolyxon")] +/// MPD client made with Rust +pub struct Args { + /// pause + #[clap(short, long, default_value = "false")] + pub pause: bool, + + /// toggle pause + #[arg(short, long, default_value = "false")] + pub toggle_pause: bool, + + /// show current status + #[arg(short, long, default_value = "false")] + pub show_status: bool, + + /// use fzf selector for selecting songs + #[arg(short, long, default_value = "false")] + pub fzf_select: bool, + + /// use dmenu selector for selecting songss + #[arg(short, long, default_value = "false")] + pub dmenu_select: bool, + + #[command(subcommand)] + pub command: Command, +} + +#[derive(Debug, Subcommand)] +pub enum Command { + #[command(arg_required_else_help = true)] + Volume { + vol: String, + }, + + Dmenu, + Fzf, + Status, + Pause, + Toggle, +} diff --git a/src/connection.rs b/src/connection.rs index 06ae752..81fb176 100755 --- a/src/connection.rs +++ b/src/connection.rs @@ -13,8 +13,8 @@ impl Connection { let songs_filenames: Vec = conn .listall() .unwrap() - .iter() - .map(|x| x.clone().file) + .into_iter() + .map(|x| x.file) .collect(); Ok(Self { @@ -70,7 +70,7 @@ impl Connection { let current_song = self.conn.currentsong(); let status = self.conn.status().unwrap(); - if current_song.is_ok() { + if current_song.is_ok() && status.state != State::Stop { let song = current_song.unwrap(); if let Some(s) = song { println!("{} - {}", s.artist.unwrap(), s.title.unwrap()); @@ -82,7 +82,7 @@ impl Connection { ); } - // Play controls + // Playback controls pub fn pause(&mut self) { self.conn.pause(true).unwrap(); } @@ -92,14 +92,15 @@ impl Connection { } // Volume controls - pub fn inc_volume(&mut self, inc: i8) { + pub fn set_volume(&mut self, u: String) { let cur = self.conn.status().unwrap().volume; - self.conn.volume(cur + inc).unwrap(); - } - - pub fn dec_volume(&mut self, dec: i8) { - let cur = self.conn.status().unwrap().volume; - self.conn.volume(cur - dec).unwrap(); + let sym = u.get(0..1).unwrap(); + let u: i8 = u.parse::().unwrap(); + if sym == "+" || sym == "-" { + self.conn.volume(cur + u).unwrap(); + } else { + self.conn.volume(u).unwrap(); + } } } diff --git a/src/main.rs b/src/main.rs index f58ce7d..09c7363 100755 --- a/src/main.rs +++ b/src/main.rs @@ -1,53 +1,23 @@ +mod cli; mod connection; use clap::Parser; +use cli::Args; +use cli::Command; use connection::Connection; -#[derive(Parser, Debug)] -#[command(version, about, long_about = None)] -struct Args { - /// pause - #[arg(short, long, default_value = "false")] - pub pause: bool, - - /// toggle pause - #[arg(short, long, default_value = "false")] - pub toggle_pause: bool, - - /// show current status - #[arg(short, long, default_value = "false")] - pub show_status: bool, - - /// use fzf selector for selecting songs - #[arg(short, long, default_value = "false")] - pub fzf_select: bool, - - /// use dmenu selector for selecting songss - #[arg(short, long, default_value = "false")] - pub dmenu_select: bool, -} - fn main() -> Result<(), Box> { let args = Args::parse(); let mut conn = Connection::new("127.0.0.1:6600")?; - if args.show_status { - conn.status(); - } - - if args.toggle_pause { - conn.toggle_pause(); - } - - if args.pause { - conn.pause(); - } - - if args.fzf_select { - conn.play_fzf(); - } - - if args.dmenu_select { - conn.play_dmenu(); + match args.command { + Command::Volume { vol } => { + conn.set_volume(vol); + } + Command::Dmenu => conn.play_dmenu(), + Command::Fzf => conn.play_fzf(), + Command::Status => conn.status(), + Command::Pause => conn.pause(), + Command::Toggle => conn.toggle_pause(), } Ok(())