From 8b6c0900d6d301eb2791a7300acfdf1cb7fcce8d Mon Sep 17 00:00:00 2001 From: Minijackson Date: Tue, 4 Sep 2018 19:30:02 +0200 Subject: Separate CLI + auto-generate completion at build time --- Cargo.toml | 4 ++++ build.rs | 23 ++++++++++++++++++++++ derivation.nix | 7 +++++++ src/cli.rs | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 60 +++------------------------------------------------------- 5 files changed, 96 insertions(+), 57 deletions(-) create mode 100644 src/cli.rs diff --git a/Cargo.toml b/Cargo.toml index e60c8dd..337fb06 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,10 @@ authors = ["Minijackson "] [build-dependencies] lalrpop = "0.15.2" +clap = "*" +clap-verbosity-flag = "0.2" +clap-log-flag = "0.1" +structopt = "0.2" [dependencies] dbus = "0.6.2" diff --git a/build.rs b/build.rs index 23c7d3f..b797f9a 100644 --- a/build.rs +++ b/build.rs @@ -1,5 +1,28 @@ extern crate lalrpop; +#[macro_use] +extern crate clap; +extern crate clap_log_flag; +extern crate clap_verbosity_flag; +#[macro_use] +extern crate structopt; + +use structopt::StructOpt; + +use clap::Shell; + +use std::env; + +#[path = "src/cli.rs"] +mod cli; + fn main() { lalrpop::process_root().unwrap(); + + let outdir = env::var_os("OUT_DIR").expect("OUT_DIR environment variable not defined"); + + let mut app = cli::Cli::clap(); + app.gen_completions("set_eq", Shell::Bash, &outdir); + app.gen_completions("set_eq", Shell::Fish, &outdir); + app.gen_completions("set_eq", Shell::Zsh, &outdir); } diff --git a/derivation.nix b/derivation.nix index 329ef3b..b895bb8 100644 --- a/derivation.nix +++ b/derivation.nix @@ -9,6 +9,13 @@ rustPlatform.buildRustPackage rec { src = ./.; cargoSha256 = "0lknxqr1pfbj6z981rw5ppkklknryyafl5f552aaw4iqhq94slq4"; + preFixup = '' + mkdir -p "$out/share/"{bash-completion/completions,fish/vendor_completions.d,zsh/site-functions} + cp target/release/build/set_eq-*/out/set_eq.bash "$out/share/bash-completion/completions/" + cp target/release/build/set_eq-*/out/set_eq.fish "$out/share/fish/vendor_completions.d/" + cp target/release/build/set_eq-*/out/_set_eq "$out/share/zsh/site-functions/" + ''; + meta = with stdenv.lib; { description = "A command-line tool to manipulate PulseAudio's equalizer"; homepage = https://github.com/minijackson/set_eq; diff --git a/src/cli.rs b/src/cli.rs new file mode 100644 index 0000000..f24b222 --- /dev/null +++ b/src/cli.rs @@ -0,0 +1,59 @@ +use clap_verbosity_flag; +use clap_log_flag; +use structopt; + +#[derive(StructOpt, Debug)] +#[structopt(raw(setting = "structopt::clap::AppSettings::ColoredHelp"))] +/// Hello World! How are you doing? +pub struct Cli { + #[structopt(flatten)] + pub verbose: clap_verbosity_flag::Verbosity, + #[structopt(flatten)] + pub log: clap_log_flag::Log, + #[structopt(short = "s")] + /// Use the given sink. + /// + /// By default it will use the last equalized sink it finds + pub sink: Option, + #[structopt(subcommand)] + pub cmd: Command, +} + +#[derive(StructOpt, Debug)] +pub enum Command { + #[structopt(name = "load",)] + /// Load and switch to a given equalizer configuration + Load(LoadCli), + #[structopt(name = "reset")] + /// Switch to a neutral equalizer + Reset(ResetCli), +} + +#[derive(StructOpt, Debug)] +pub struct LoadCli { + #[structopt(default_value = "-")] + /// The file from which to load the equalizer configuration + /// + /// If "-" is given, read the configuration from the command-line. + pub file: String, + #[structopt( + short = "f", + raw( + possible_values = "&EqualizerConfFormat::variants()", + case_insensitive = "true" + ), + default_value = "EqualizerAPO" + )] + /// The file format of the equalizer configuration + pub format: EqualizerConfFormat, +} + +arg_enum! { + #[derive(Debug)] + pub enum EqualizerConfFormat { + EqualizerAPO + } +} + +#[derive(StructOpt, Debug)] +pub struct ResetCli {} diff --git a/src/main.rs b/src/main.rs index 360117c..85d2443 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,75 +14,21 @@ extern crate structopt; extern crate lalrpop_util; +mod cli; mod dbus_api; mod parsing; mod utils; use utils::*; - use dbus_api::sink::OrgPulseAudioExtEqualizing1Equalizer; +use cli::*; + use failure::Error; use structopt::StructOpt; use std::fs::File; use std::io; -#[derive(StructOpt, Debug)] -#[structopt(raw(setting = "structopt::clap::AppSettings::ColoredHelp"))] -/// Hello World! How are you doing? -struct Cli { - #[structopt(flatten)] - verbose: clap_verbosity_flag::Verbosity, - #[structopt(flatten)] - log: clap_log_flag::Log, - #[structopt(short = "s")] - /// Use the given sink. - /// - /// By default it will use the last equalized sink it finds - sink: Option, - #[structopt(subcommand)] - cmd: Command, -} - -#[derive(StructOpt, Debug)] -enum Command { - #[structopt(name = "load",)] - /// Load and switch to a given equalizer configuration - Load(LoadCli), - #[structopt(name = "reset")] - /// Switch to a neutral equalizer - Reset(ResetCli), -} - -#[derive(StructOpt, Debug)] -struct LoadCli { - #[structopt(default_value = "-")] - /// The file from which to load the equalizer configuration - /// - /// If "-" is given, read the configuration from the command-line. - file: String, - #[structopt( - short = "f", - raw( - possible_values = "&EqualizerConfFormat::variants()", - case_insensitive = "true" - ), - default_value = "EqualizerAPO" - )] - /// The file format of the equalizer configuration - format: EqualizerConfFormat, -} - -arg_enum! { - #[derive(Debug)] - enum EqualizerConfFormat { - EqualizerAPO - } -} - -#[derive(StructOpt, Debug)] -struct ResetCli {} - #[derive(Debug)] pub struct Filter { preamp: f64, -- cgit v1.2.3