diff --git a/Cargo.lock b/Cargo.lock index f7f4a82e..7e792029 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -151,6 +151,38 @@ dependencies = [ "syn 2.0.114", ] +[[package]] +name = "argh" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ff18325c8a36b82f992e533ece1ec9f9a9db446bd1c14d4f936bac88fcd240" +dependencies = [ + "argh_derive", + "argh_shared", + "rust-fuzzy-search", +] + +[[package]] +name = "argh_derive" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b2b83a50d329d5d8ccc620f5c7064028828538bdf5646acd60dc1f767803" +dependencies = [ + "argh_shared", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "argh_shared" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a464143cc82dedcdc3928737445362466b7674b5db4e2eb8e869846d6d84f4f6" +dependencies = [ + "serde", +] + [[package]] name = "arrayref" version = "0.3.9" @@ -182,6 +214,7 @@ dependencies = [ name = "asusctl" version = "6.2.0" dependencies = [ + "argh", "dmi_id", "env_logger", "gumdrop", @@ -4621,6 +4654,12 @@ dependencies = [ "libusb1-sys", ] +[[package]] +name = "rust-fuzzy-search" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a157657054ffe556d8858504af8a672a054a6e0bd9e8ee531059100c0fa11bb2" + [[package]] name = "rustc-hash" version = "1.1.0" diff --git a/asusctl/Cargo.toml b/asusctl/Cargo.toml index fd69a065..9a8cdce1 100644 --- a/asusctl/Cargo.toml +++ b/asusctl/Cargo.toml @@ -24,6 +24,7 @@ env_logger.workspace = true ron.workspace = true gumdrop.workspace = true zbus.workspace = true +argh = "0.1" [dev-dependencies] rog_dbus = { path = "../rog-dbus" } diff --git a/asusctl/src/anime_cli.rs b/asusctl/src/anime_cli.rs index 15dc17e2..57065b0b 100644 --- a/asusctl/src/anime_cli.rs +++ b/asusctl/src/anime_cli.rs @@ -1,154 +1,151 @@ -use gumdrop::Options; -use rog_anime::usb::{AnimAwake, AnimBooting, AnimShutdown, AnimSleeping, Brightness}; +use argh::FromArgs; +use rog_anime::usb::{AnimAwake, AnimBooting, AnimShutdown, AnimSleeping}; use rog_anime::AnimeType; -#[derive(Options)] +#[derive(FromArgs, Debug)] +#[argh(subcommand, name = "anime", description = "anime commands")] pub struct AnimeCommand { - #[options(help = "print help message")] - pub help: bool, - #[options(meta = "", help = "override the display type")] + #[argh(option, description = "override the display type")] pub override_type: Option, - #[options(meta = "", help = "enable/disable the display")] + #[argh(option, description = "enable/disable the display")] pub enable_display: Option, - #[options(meta = "", help = "enable/disable the builtin run/powersave animation")] - pub enable_powersave_anim: Option, - #[options( - meta = "", - help = "set global base brightness value " + #[argh( + option, + description = "enable/disable the builtin run/powersave animation" )] - pub brightness: Option, - #[options(help = "clear the display")] + pub enable_powersave_anim: Option, + #[argh( + option, + description = "set global base brightness value " + )] + pub brightness: Option, + #[argh(switch, description = "clear the display")] pub clear: bool, - #[options( - no_short, - meta = "", - help = "turn the anime off when external power is unplugged" + #[argh( + option, + description = "turn the anime off when external power is unplugged" )] pub off_when_unplugged: Option, - #[options( - no_short, - meta = "", - help = "turn the anime off when the laptop suspends" - )] + #[argh(option, description = "turn the anime off when the laptop suspends")] pub off_when_suspended: Option, - #[options( - no_short, - meta = "", - help = "turn the anime off when the lid is closed" - )] + #[argh(option, description = "turn the anime off when the lid is closed")] pub off_when_lid_closed: Option, - #[options(no_short, meta = "", help = "Off with his head!!!")] + #[argh(option, description = "off with his head!!!")] pub off_with_his_head: Option, - #[options(command)] + #[argh(subcommand)] pub command: Option, } -#[derive(Options)] +/// Anime subcommands (image, gif, builtins, etc.) +#[derive(FromArgs, Debug)] +#[argh(subcommand)] pub enum AnimeActions { - #[options(help = "display a PNG image")] Image(AnimeImage), - #[options(help = "display a diagonal/pixel-perfect PNG")] PixelImage(AnimeImageDiagonal), - #[options(help = "display an animated GIF")] Gif(AnimeGif), - #[options(help = "display an animated diagonal/pixel-perfect GIF")] PixelGif(AnimeGifDiagonal), - #[options(help = "change which builtin animations are shown")] SetBuiltins(Builtins), } -#[derive(Options)] +#[derive(FromArgs, Debug)] +#[argh( + subcommand, + name = "set-builtins", + description = "change which builtin animations are shown" +)] pub struct Builtins { - #[options(help = "print help message")] - pub help: bool, - #[options( - meta = "", - help = "Default is used if unspecified, " + #[argh( + option, + description = "default is used if unspecified, " )] pub boot: AnimBooting, - #[options( - meta = "", - help = "Default is used if unspecified, " + #[argh( + option, + description = "default is used if unspecified, " )] pub awake: AnimAwake, - #[options( - meta = "", - help = "Default is used if unspecified, " + #[argh( + option, + description = "default is used if unspecified, " )] pub sleep: AnimSleeping, - #[options( - meta = "", - help = "Default is used if unspecified, " + #[argh( + option, + description = "default is used if unspecified, " )] pub shutdown: AnimShutdown, - #[options(meta = "", help = "set/apply the animations ")] + #[argh(option, description = "set/apply the animations ")] pub set: Option, } -#[derive(Options)] +#[derive(FromArgs, Debug)] +#[argh(subcommand, name = "image", description = "display a PNG image")] pub struct AnimeImage { - #[options(help = "print help message")] - pub help: bool, - #[options(meta = "", help = "full path to the png to display")] + #[argh(option, description = "full path to the png to display")] pub path: String, - #[options(meta = "", default = "1.0", help = "scale 1.0 == normal")] + #[argh(option, default = "1.0", description = "scale 1.0 == normal")] pub scale: f32, - #[options(meta = "", default = "0.0", help = "x position (float)")] + #[argh(option, default = "0.0", description = "x position (float)")] pub x_pos: f32, - #[options(meta = "", default = "0.0", help = "y position (float)")] + #[argh(option, default = "0.0", description = "y position (float)")] pub y_pos: f32, - #[options(meta = "", default = "0.0", help = "the angle in radians")] + #[argh(option, default = "0.0", description = "the angle in radians")] pub angle: f32, - #[options(meta = "", default = "1.0", help = "brightness 0.0-1.0")] + #[argh(option, default = "1.0", description = "brightness 0.0-1.0")] pub bright: f32, } -#[derive(Options)] +#[derive(FromArgs, Debug)] +#[argh( + subcommand, + name = "pixel-image", + description = "display a diagonal/pixel-perfect PNG" +)] pub struct AnimeImageDiagonal { - #[options(help = "print help message")] - pub help: bool, - #[options(meta = "", help = "full path to the png to display")] + #[argh(option, description = "full path to the png to display")] pub path: String, - #[options(meta = "", default = "1.0", help = "brightness 0.0-1.0")] + #[argh(option, default = "1.0", description = "brightness 0.0-1.0")] pub bright: f32, } -#[derive(Options)] +#[derive(FromArgs, Debug)] +#[argh(subcommand, name = "gif", description = "display an animated GIF")] pub struct AnimeGif { - #[options(help = "print help message")] - pub help: bool, - #[options(meta = "", help = "full path to the png to display")] + #[argh(option, description = "full path to the gif to display")] pub path: String, - #[options(meta = "", default = "1.0", help = "scale 1.0 == normal")] + #[argh(option, default = "1.0", description = "scale 1.0 == normal")] pub scale: f32, - #[options(meta = "", default = "0.0", help = "x position (float)")] + #[argh(option, default = "0.0", description = "x position (float)")] pub x_pos: f32, - #[options(meta = "", default = "0.0", help = "y position (float)")] + #[argh(option, default = "0.0", description = "y position (float)")] pub y_pos: f32, - #[options(meta = "", default = "0.0", help = "the angle in radians")] + #[argh(option, default = "0.0", description = "the angle in radians")] pub angle: f32, - #[options(meta = "", default = "1.0", help = "brightness 0.0-1.0")] + #[argh(option, default = "1.0", description = "brightness 0.0-1.0")] pub bright: f32, - #[options( - meta = "", + #[argh( + option, default = "1", - help = "how many loops to play - 0 is infinite" + description = "how many loops to play - 0 is infinite" )] pub loops: u32, } -#[derive(Options)] +#[derive(FromArgs, Debug)] +#[argh( + subcommand, + name = "pixel-gif", + description = "display an animated diagonal/pixel-perfect GIF" +)] pub struct AnimeGifDiagonal { - #[options(help = "print help message")] - pub help: bool, - #[options(meta = "", help = "full path to the png to display")] + #[argh(option, description = "full path to the gif to display")] pub path: String, - #[options(meta = "", default = "1.0", help = "brightness 0.0-1.0")] + #[argh(option, default = "1.0", description = "brightness 0.0-1.0")] pub bright: f32, - #[options( - meta = "", + #[argh( + option, default = "1", - help = "how many loops to play - 0 is infinite" + description = "how many loops to play - 0 is infinite" )] pub loops: u32, } diff --git a/asusctl/src/aura_cli.rs b/asusctl/src/aura_cli.rs index f67a5b23..a00645d3 100644 --- a/asusctl/src/aura_cli.rs +++ b/asusctl/src/aura_cli.rs @@ -1,68 +1,66 @@ use std::str::FromStr; -use gumdrop::Options; +use argh::FromArgs; use rog_aura::error::Error; use rog_aura::{AuraEffect, AuraModeNum, AuraZone, Colour, Direction, Speed}; -#[derive(Options, Debug)] +#[derive(FromArgs, Debug, Clone)] +#[argh( + subcommand, + name = "aura-power-old", + description = "aura power (old api)" +)] pub struct LedPowerCommand1 { - #[options(help = "print help message")] - pub help: bool, - #[options(meta = "", help = "Control if LEDs enabled while awake ")] + #[argh( + option, + description = "control if LEDs enabled while awake " + )] pub awake: Option, - #[options(help = "Use with awake option, if excluded defaults to false")] + + #[argh( + switch, + description = "use with awake option; if excluded defaults to false" + )] pub keyboard: bool, - #[options(help = "Use with awake option, if excluded defaults to false")] + + #[argh( + switch, + description = "use with awake option; if excluded defaults to false" + )] pub lightbar: bool, - #[options(meta = "", help = "Control boot animations ")] + + #[argh(option, description = "control boot animations ")] pub boot: Option, - #[options(meta = "", help = "Control suspend animations ")] + + #[argh(option, description = "control suspend animations ")] pub sleep: Option, } -#[derive(Options, Debug)] +#[derive(FromArgs, Debug, Clone)] +#[argh(subcommand, name = "aura-power", description = "aura power")] pub struct LedPowerCommand2 { - #[options(help = "print help message")] - pub help: bool, - #[options(command)] + #[argh(subcommand)] pub command: Option, } -#[derive(Options, Debug)] +/// Subcommands to enable/disable specific aura zones +#[derive(FromArgs, Debug, Clone)] +#[argh(subcommand)] pub enum SetAuraZoneEnabled { - /// Applies to both old and new models - #[options(help = "")] - Keyboard(AuraPowerStates), - #[options(help = "")] - Logo(AuraPowerStates), - #[options(help = "")] - Lightbar(AuraPowerStates), - #[options(help = "")] - Lid(AuraPowerStates), - #[options(help = "")] - RearGlow(AuraPowerStates), - #[options(help = "")] - Ally(AuraPowerStates), + Keyboard(KeyboardPower), + Logo(LogoPower), + Lightbar(LightbarPower), + Lid(LidPower), + RearGlow(RearGlowPower), + Ally(AllyPower), } -#[derive(Debug, Clone, Options)] -pub struct AuraPowerStates { - #[options(help = "print help message")] - pub help: bool, - #[options(help = "defaults to false if option unused")] - pub boot: bool, - #[options(help = "defaults to false if option unused")] - pub awake: bool, - #[options(help = "defaults to false if option unused")] - pub sleep: bool, - #[options(help = "defaults to false if option unused")] - pub shutdown: bool, -} - -#[derive(Options)] +/// Keyboard brightness argument helper +#[derive(Debug, Clone)] pub struct LedBrightness { level: Option, } + impl LedBrightness { pub fn new(level: Option) -> Self { LedBrightness { level } @@ -72,176 +70,296 @@ impl LedBrightness { self.level } } + impl FromStr for LedBrightness { type Err = Error; fn from_str(s: &str) -> Result { let s = s.to_lowercase(); match s.as_str() { - "off" => Ok(LedBrightness { level: Some(0x00) }), - "low" => Ok(LedBrightness { level: Some(0x01) }), - "med" => Ok(LedBrightness { level: Some(0x02) }), - "high" => Ok(LedBrightness { level: Some(0x03) }), - _ => { - print!("Invalid argument, must be one of: off, low, med, high"); - Err(Error::ParseBrightness) - } + "off" => Ok(Self::new(Some(0x00))), + "low" => Ok(Self::new(Some(0x01))), + "med" => Ok(Self::new(Some(0x02))), + "high" => Ok(Self::new(Some(0x03))), + _ => Err(Error::ParseBrightness), } } } -#[allow(clippy::to_string_trait_impl)] + impl ToString for LedBrightness { fn to_string(&self) -> String { - let s = match self.level { - Some(0x00) => "low", - Some(0x01) => "med", - Some(0x02) => "high", - _ => "unknown", - }; - s.to_owned() + match self.level { + Some(0x00) => "off".to_owned(), + Some(0x01) => "low".to_owned(), + Some(0x02) => "med".to_owned(), + Some(0x03) => "high".to_owned(), + _ => "unknown".to_owned(), + } } } -#[derive(Debug, Clone, Options, Default)] +#[derive(FromArgs, Debug, Clone, Default)] +#[argh( + subcommand, + name = "keyboard", + description = "set power states for keyboard zone" +)] +pub struct KeyboardPower { + #[argh(switch, description = "defaults to false if option unused")] + pub boot: bool, + #[argh(switch, description = "defaults to false if option unused")] + pub awake: bool, + #[argh(switch, description = "defaults to false if option unused")] + pub sleep: bool, + #[argh(switch, description = "defaults to false if option unused")] + pub shutdown: bool, +} + +#[derive(FromArgs, Debug, Clone, Default)] +#[argh( + subcommand, + name = "logo", + description = "set power states for logo zone" +)] +pub struct LogoPower { + #[argh(switch, description = "defaults to false if option unused")] + pub boot: bool, + #[argh(switch, description = "defaults to false if option unused")] + pub awake: bool, + #[argh(switch, description = "defaults to false if option unused")] + pub sleep: bool, + #[argh(switch, description = "defaults to false if option unused")] + pub shutdown: bool, +} + +#[derive(FromArgs, Debug, Clone, Default)] +#[argh( + subcommand, + name = "lightbar", + description = "set power states for lightbar zone" +)] +pub struct LightbarPower { + #[argh(switch, description = "enable power while device is booting")] + pub boot: bool, + #[argh(switch, description = "enable power while device is awake")] + pub awake: bool, + #[argh(switch, description = "enable power while device is sleeping")] + pub sleep: bool, + #[argh( + switch, + description = "enable power while device is shutting down or hibernating" + )] + pub shutdown: bool, +} + +#[derive(FromArgs, Debug, Clone, Default)] +#[argh( + subcommand, + name = "lid", + description = "set power states for lid zone" +)] +pub struct LidPower { + #[argh(switch, description = "defaults to false if option unused")] + pub boot: bool, + #[argh(switch, description = "defaults to false if option unused")] + pub awake: bool, + #[argh(switch, description = "defaults to false if option unused")] + pub sleep: bool, + #[argh(switch, description = "defaults to false if option unused")] + pub shutdown: bool, +} + +#[derive(FromArgs, Debug, Clone, Default)] +#[argh( + subcommand, + name = "rear-glow", + description = "set power states for rear glow zone" +)] +pub struct RearGlowPower { + #[argh(switch, description = "defaults to false if option unused")] + pub boot: bool, + #[argh(switch, description = "defaults to false if option unused")] + pub awake: bool, + #[argh(switch, description = "defaults to false if option unused")] + pub sleep: bool, + #[argh(switch, description = "defaults to false if option unused")] + pub shutdown: bool, +} + +#[derive(FromArgs, Debug, Clone, Default)] +#[argh( + subcommand, + name = "ally", + description = "set power states for ally zone" +)] +pub struct AllyPower { + #[argh(switch, description = "defaults to false if option unused")] + pub boot: bool, + #[argh(switch, description = "defaults to false if option unused")] + pub awake: bool, + #[argh(switch, description = "defaults to false if option unused")] + pub sleep: bool, + #[argh(switch, description = "defaults to false if option unused")] + pub shutdown: bool, +} + +/// Single speed-based effect +#[derive(FromArgs, Debug, Clone, Default)] +#[argh( + subcommand, + name = "rainbow-cycle", + description = "single speed-based effect" +)] pub struct SingleSpeed { - #[options(help = "print help message")] - help: bool, - #[options(no_long, meta = "WORD", help = "set the speed: low, med, high")] + #[argh(option, description = "set the speed: low, med, high")] pub speed: Speed, - #[options( - no_long, - meta = "", - help = "set the zone for this effect e.g, 0, 1, one, logo, lightbar-left" + + #[argh( + option, + description = "set the zone for this effect e.g. 0, 1, one, logo, lightbar-left" )] pub zone: AuraZone, } -#[derive(Debug, Clone, Options, Default)] +/// Single speed effect with direction +#[derive(FromArgs, Debug, Clone, Default)] +#[argh( + subcommand, + name = "rainbow-wave", + description = "single speed effect with direction" +)] pub struct SingleSpeedDirection { - #[options(help = "print help message")] - help: bool, - #[options(no_long, meta = "", help = "set the direction: up, down, left, right")] + #[argh(option, description = "set the direction: up, down, left, right")] pub direction: Direction, - #[options(no_long, meta = "", help = "set the speed: low, med, high")] + + #[argh(option, description = "set the speed: low, med, high")] pub speed: Speed, - #[options( - no_long, - meta = "", - help = "set the zone for this effect e.g, 0, 1, one, logo, lightbar-left" + + #[argh( + option, + description = "set the zone for this effect e.g. 0, 1, one, logo, lightbar-left" )] pub zone: AuraZone, } -#[derive(Debug, Clone, Default, Options)] +/// Static single-colour effect +#[derive(FromArgs, Debug, Clone, Default)] +#[argh( + subcommand, + name = "static", + description = "static single-colour effect" +)] pub struct SingleColour { - #[options(help = "print help message")] - help: bool, - #[options(no_long, meta = "", help = "set the RGB value e.g, ff00ff")] + #[argh(option, description = "set the RGB value e.g. ff00ff")] pub colour: Colour, - #[options( - no_long, - meta = "", - help = "set the zone for this effect e.g, 0, 1, one, logo, lightbar-left" + + #[argh( + option, + description = "set the zone for this effect e.g. 0, 1, one, logo, lightbar-left" )] pub zone: AuraZone, } -#[derive(Debug, Clone, Default, Options)] +/// Single-colour effect with speed +#[derive(FromArgs, Debug, Clone, Default)] +#[argh( + subcommand, + name = "highlight", + description = "single-colour effect with speed" +)] pub struct SingleColourSpeed { - #[options(help = "print help message")] - help: bool, - #[options(no_long, meta = "", help = "set the RGB value e.g, ff00ff")] + #[argh(option, description = "set the RGB value e.g. ff00ff")] pub colour: Colour, - #[options(no_long, meta = "", help = "set the speed: low, med, high")] + + #[argh(option, description = "set the speed: low, med, high")] pub speed: Speed, - #[options( - no_long, - meta = "", - help = "set the zone for this effect e.g, 0, 1, one, logo, lightbar-left" + + #[argh( + option, + description = "set the zone for this effect e.g. 0, 1, one, logo, lightbar-left" )] pub zone: AuraZone, } -#[derive(Debug, Clone, Options, Default)] +/// Two-colour breathing effect +#[derive(FromArgs, Debug, Clone, Default)] +#[argh( + subcommand, + name = "breathe", + description = "two-colour breathing effect" +)] pub struct TwoColourSpeed { - #[options(help = "print help message")] - help: bool, - #[options(no_long, meta = "", help = "set the first RGB value e.g, ff00ff")] + #[argh(option, description = "set the first RGB value e.g. ff00ff")] pub colour: Colour, - #[options(no_long, meta = "", help = "set the second RGB value e.g, ff00ff")] + + #[argh(option, description = "set the second RGB value e.g. ff00ff")] pub colour2: Colour, - #[options(no_long, meta = "", help = "set the speed: low, med, high")] + + #[argh(option, description = "set the speed: low, med, high")] pub speed: Speed, - #[options( - no_long, - meta = "", - help = "set the zone for this effect e.g, 0, 1, one, logo, lightbar-left" + + #[argh( + option, + description = "set the zone for this effect e.g. 0, 1, one, logo, lightbar-left" )] pub zone: AuraZone, } -#[derive(Debug, Clone, Default, Options)] +/// Multi-zone colour settings +#[derive(FromArgs, Debug, Clone, Default)] #[allow(dead_code)] +#[argh(description = "multi-zone colour settings")] pub struct MultiZone { - #[options(help = "print help message")] - help: bool, - #[options(short = "a", meta = "", help = "set the RGB value e.g, ff00ff")] + #[argh(option, short = 'a', description = "set the RGB value e.g. ff00ff")] pub colour1: Colour, - #[options(short = "b", meta = "", help = "set the RGB value e.g, ff00ff")] + + #[argh(option, short = 'b', description = "set the RGB value e.g. ff00ff")] pub colour2: Colour, - #[options(short = "c", meta = "", help = "set the RGB value e.g, ff00ff")] + + #[argh(option, short = 'c', description = "set the RGB value e.g. ff00ff")] pub colour3: Colour, - #[options(short = "d", meta = "", help = "set the RGB value e.g, ff00ff")] + + #[argh(option, short = 'd', description = "set the RGB value e.g. ff00ff")] pub colour4: Colour, } -#[derive(Debug, Clone, Default, Options)] +/// Multi-colour with speed +#[derive(FromArgs, Debug, Clone, Default)] #[allow(dead_code)] +#[argh(description = "multi-colour with speed")] pub struct MultiColourSpeed { - #[options(help = "print help message")] - help: bool, - #[options(short = "a", meta = "", help = "set the RGB value e.g, ff00ff")] + #[argh(option, short = 'a', description = "set the RGB value e.g. ff00ff")] pub colour1: Colour, - #[options(short = "b", meta = "", help = "set the RGB value e.g, ff00ff")] + + #[argh(option, short = 'b', description = "set the RGB value e.g. ff00ff")] pub colour2: Colour, - #[options(short = "c", meta = "", help = "set the RGB value e.g, ff00ff")] + + #[argh(option, short = 'c', description = "set the RGB value e.g. ff00ff")] pub colour3: Colour, - #[options(short = "d", meta = "", help = "set the RGB value e.g, ff00ff")] + + #[argh(option, short = 'd', description = "set the RGB value e.g. ff00ff")] pub colour4: Colour, - #[options(no_long, meta = "", help = "set the speed: low, med, high")] + + #[argh(option, description = "set the speed: low, med, high")] pub speed: Speed, } -/// Byte value for setting the built-in mode. -/// -/// Enum corresponds to the required integer value -// NOTE: The option names here must match those in rog-aura crate -#[derive(Options)] +/// Builtin aura effects +#[derive(FromArgs, Debug)] +#[argh(subcommand)] pub enum SetAuraBuiltin { - #[options(help = "set a single static colour")] - Static(SingleColour), // 0 - #[options(help = "pulse between one or two colours")] - Breathe(TwoColourSpeed), // 1 - #[options(help = "strobe through all colours")] - RainbowCycle(SingleSpeed), // 2 - #[options(help = "rainbow cycling in one of four directions")] + Static(SingleColour), // 0 + Breathe(TwoColourSpeed), // 1 + RainbowCycle(SingleSpeed), // 2 RainbowWave(SingleSpeedDirection), // 3 - #[options(help = "rain pattern mimicking raindrops")] - Stars(TwoColourSpeed), // 4 - #[options(help = "rain pattern of three preset colours")] - Rain(SingleSpeed), // 5 - #[options(help = "pressed keys are highlighted to fade")] - Highlight(SingleColourSpeed), // 6 - #[options(help = "pressed keys generate horizontal laser")] - Laser(SingleColourSpeed), // 7 - #[options(help = "pressed keys ripple outwards like a splash")] - Ripple(SingleColourSpeed), // 8 - #[options(help = "set a rapid pulse")] - Pulse(SingleColour), // 10 - #[options(help = "set a vertical line zooming from left")] - Comet(SingleColour), // 11 - #[options(help = "set a wide vertical line zooming from left")] - Flash(SingleColour), // 12 + Stars(TwoColourSpeed), // 4 + Rain(SingleSpeed), // 5 + Highlight(SingleColourSpeed), // 6 + Laser(SingleColourSpeed), // 7 + Ripple(SingleColourSpeed), // 8 + Pulse(SingleColour), // 10 + Comet(SingleColour), // 11 + Flash(SingleColour), // 12 } impl Default for SetAuraBuiltin { diff --git a/asusctl/src/cli_opts.rs b/asusctl/src/cli_opts.rs index 6b9c5492..692ab8e3 100644 --- a/asusctl/src/cli_opts.rs +++ b/asusctl/src/cli_opts.rs @@ -1,4 +1,4 @@ -use gumdrop::Options; +use argh::FromArgs; use rog_platform::platform::PlatformProfile; use crate::anime_cli::AnimeCommand; @@ -7,128 +7,131 @@ use crate::fan_curve_cli::FanCurveCommand; use crate::scsi_cli::ScsiCommand; use crate::slash_cli::SlashCommand; -#[derive(Default, Options)] +#[derive(FromArgs, Default, Debug)] +/// asusctl command-line options pub struct CliStart { - #[options(help_flag, help = "print help message")] - pub help: bool, - #[options(help = "show program version number")] + #[argh(switch, description = "show program version number")] pub version: bool, - #[options(help = "show supported functions of this laptop")] + + #[argh(switch, description = "show supported functions of this laptop")] pub show_supported: bool, - #[options(meta = "", help = "")] + + #[argh(option, description = "keyboard brightness ")] pub kbd_bright: Option, - #[options(help = "Toggle to next keyboard brightness")] + + #[argh(switch, description = "toggle to next keyboard brightness")] pub next_kbd_bright: bool, - #[options(help = "Toggle to previous keyboard brightness")] + + #[argh(switch, description = "toggle to previous keyboard brightness")] pub prev_kbd_bright: bool, - #[options(meta = "", help = "Set your battery charge limit <20-100>")] + + #[argh(option, description = "set your battery charge limit <20-100>")] pub chg_limit: Option, - #[options(help = "Toggle one-shot battery charge to 100%")] + + #[argh(switch, description = "toggle one-shot battery charge to 100%")] pub one_shot_chg: bool, - #[options(command)] + + #[argh(subcommand)] pub command: Option, } -#[derive(Options)] +/// Top-level subcommands for asusctl +#[derive(FromArgs, Debug)] +#[argh(subcommand)] pub enum CliCommand { - #[options(help = "Set the keyboard lighting from built-in modes")] Aura(LedModeCommand), - #[options(help = "Set the LED power states")] AuraPowerOld(LedPowerCommand1), - #[options(help = "Set the LED power states")] AuraPower(LedPowerCommand2), - #[options(help = "Set or select platform_profile")] Profile(ProfileCommand), - #[options(help = "Set, select, or modify fan curves if supported")] FanCurve(FanCurveCommand), - #[options(help = "Set the graphics mode (obsoleted by supergfxctl)")] Graphics(GraphicsCommand), - #[options(name = "anime", help = "Manage AniMe Matrix")] Anime(AnimeCommand), - #[options(name = "slash", help = "Manage Slash Ledbar")] Slash(SlashCommand), - #[options(name = "scsi", help = "Manage SCSI external drive")] Scsi(ScsiCommand), - #[options( - help = "Change platform settings. This is a new interface exposed by the asus-armoury \ - driver, some of the settings will be the same as the older platform interface" - )] Armoury(ArmouryCommand), - #[options(name = "backlight", help = "Set screen backlight levels")] Backlight(BacklightCommand), } -#[derive(Debug, Clone, Options)] +#[derive(FromArgs, Debug, Clone, Default)] +#[argh(subcommand, name = "profile", description = "profile management")] pub struct ProfileCommand { - #[options(help = "print help message")] - pub help: bool, - - #[options(help = "toggle to next profile in list")] + #[argh(switch, description = "toggle to next profile in list")] pub next: bool, - #[options(help = "list available profiles")] + #[argh(switch, description = "list available profiles")] pub list: bool, - #[options(help = "get profile")] + #[argh(switch, description = "get profile")] pub profile_get: bool, - #[options(meta = "", help = "set the active profile")] + #[argh(option, description = "set the active profile")] pub profile_set: Option, - #[options(short = "a", meta = "", help = "set the profile to use on AC power")] + #[argh( + option, + short = 'a', + description = "set the profile to use on AC power" + )] pub profile_set_ac: Option, - #[options( - short = "b", - meta = "", - help = "set the profile to use on battery power" + #[argh( + option, + short = 'b', + description = "set the profile to use on battery power" )] pub profile_set_bat: Option, } -#[derive(Options)] +#[derive(FromArgs, Debug, Default)] +#[argh(subcommand, name = "aura", description = "led mode commands")] pub struct LedModeCommand { - #[options(help = "print help message")] - pub help: bool, - #[options(help = "switch to next aura mode")] + #[argh(switch, description = "switch to next aura mode")] pub next_mode: bool, - #[options(help = "switch to previous aura mode")] + + #[argh(switch, description = "switch to previous aura mode")] pub prev_mode: bool, - #[options(command)] + + #[argh(subcommand)] pub command: Option, } -#[derive(Options)] -pub struct GraphicsCommand { - #[options(help = "print help message")] - pub help: bool, -} +#[derive(FromArgs, Debug, Default)] +#[argh( + subcommand, + name = "graphics", + description = "graphics command (deprecated)" +)] +pub struct GraphicsCommand {} -#[derive(Options, Debug)] +#[derive(FromArgs, Debug, Default)] +#[argh( + subcommand, + name = "armoury", + description = "armoury / firmware attributes" +)] pub struct ArmouryCommand { - #[options(help = "print help message")] - pub help: bool, - #[options( - free, - help = "append each value name followed by the value to set. `-1` sets to default" + #[argh( + positional, + description = "append each value name followed by the value to set. `-1` sets to default" )] pub free: Vec, } -#[derive(Options)] +#[derive(FromArgs, Debug, Default)] +#[argh(subcommand, name = "backlight", description = "backlight options")] pub struct BacklightCommand { - #[options(help = "print help message")] - pub help: bool, - #[options(meta = "", help = "Set screen brightness <0-100>")] + #[argh(option, description = "set screen brightness <0-100>")] pub screenpad_brightness: Option, - #[options( - meta = "", - help = "Set screenpad gamma brightness 0.5 - 2.2, 1.0 == linear" + + #[argh( + option, + description = "set screenpad gamma brightness 0.5 - 2.2, 1.0 == linear" )] pub screenpad_gamma: Option, - #[options( - meta = "", - help = "Set screenpad brightness to sync with primary display" + + #[argh( + option, + description = "set screenpad brightness to sync with primary display" )] pub sync_screenpad_brightness: Option, } diff --git a/asusctl/src/fan_curve_cli.rs b/asusctl/src/fan_curve_cli.rs index 4584efdf..1060cece 100644 --- a/asusctl/src/fan_curve_cli.rs +++ b/asusctl/src/fan_curve_cli.rs @@ -1,49 +1,44 @@ -use gumdrop::Options; +use argh::FromArgs; use rog_platform::platform::PlatformProfile; use rog_profiles::fan_curve_set::CurveData; use rog_profiles::FanCurvePU; -#[derive(Debug, Clone, Options)] +#[derive(FromArgs, Debug, Clone)] +#[argh(subcommand, name = "fan-curve", description = "fan curve commands")] pub struct FanCurveCommand { - #[options(help = "print help message")] - pub help: bool, - - #[options(help = "get enabled fan profiles")] + #[argh(switch, description = "get enabled fan profiles")] pub get_enabled: bool, - #[options(help = "set the active profile's fan curve to default")] + #[argh(switch, description = "set the active profile's fan curve to default")] pub default: bool, - #[options( - meta = "", - help = "profile to modify fan-curve for. Shows data if no options provided" + #[argh( + option, + description = "profile to modify fan-curve for. shows data if no options provided" )] pub mod_profile: Option, - #[options( - meta = "", - help = "enable or disable fan all curves for a profile. `--mod_profile` \ - required" + #[argh( + option, + description = "enable or disable fan all curves for a profile; --mod_profile required" )] pub enable_fan_curves: Option, - #[options( - meta = "", - help = "enable or disable a single fan curve for a profile. `--mod_profile` \ - and `--fan` required" + #[argh( + option, + description = "enable or disable a single fan curve for a profile; --mod_profile and --fan required" )] pub enable_fan_curve: Option, - #[options( - meta = "", - help = "select fan to modify. `--mod_profile` required" + #[argh( + option, + description = "select fan to modify; --mod_profile required" )] pub fan: Option, - #[options( - meta = "", - help = "data format = 30c:1%,49c:2%,59c:3%,69c:4%,79c:31%,89c:49%,99c:56%,109c:58%. \ - `--mod-profile` required. If '%' is omitted the fan range is 0-255" + #[argh( + option, + description = "data format = 30c:1%,49c:2%,...; --mod-profile required. If '%' is omitted the fan range is 0-255" )] pub data: Option, } diff --git a/asusctl/src/main.rs b/asusctl/src/main.rs index 4c22ecbf..80e0b330 100644 --- a/asusctl/src/main.rs +++ b/asusctl/src/main.rs @@ -1,19 +1,18 @@ use std::convert::TryFrom; -use std::env::args; use std::path::Path; use std::process::Command; use std::thread::sleep; use anime_cli::{AnimeActions, AnimeCommand}; +use argh; use aura_cli::{LedPowerCommand1, LedPowerCommand2}; use dmi_id::DMIID; use fan_curve_cli::FanCurveCommand; -use gumdrop::{Opt, Options}; use log::{error, info, LevelFilter}; use rog_anime::usb::get_anime_type; use rog_anime::{AnimTime, AnimeDataBuffer, AnimeDiagonal, AnimeGif, AnimeImage, AnimeType, Vec2}; use rog_aura::keyboard::{AuraPowerState, LaptopAuraPower}; -use rog_aura::{self, AuraDeviceType, AuraEffect, PowerZones}; +use rog_aura::{self, AuraEffect, PowerZones}; use rog_dbus::asus_armoury::AsusArmouryProxyBlocking; use rog_dbus::list_iface_blocking; use rog_dbus::scsi_aura::ScsiAuraProxyBlocking; @@ -32,7 +31,6 @@ use scsi_cli::ScsiCommand; use zbus::blocking::proxy::ProxyImpl; use zbus::blocking::Connection; -use crate::aura_cli::{AuraPowerStates, LedBrightness}; use crate::cli_opts::*; use crate::slash_cli::SlashCommand; @@ -58,20 +56,7 @@ fn main() { let self_version = env!("CARGO_PKG_VERSION"); println!("Starting version {self_version}"); - let args: Vec = args().skip(1).collect(); - - let missing_argument_k = gumdrop::Error::missing_argument(Opt::Short('k')); - let parsed = match CliStart::parse_args_default(&args) { - Ok(p) => p, - Err(err) if err.to_string() == missing_argument_k.to_string() => CliStart { - kbd_bright: Some(LedBrightness::new(None)), - ..Default::default() - }, - Err(err) => { - println!("Error: {}", err); - return; - } - }; + let parsed: CliStart = argh::from_env(); let conn = Connection::system().unwrap(); if let Ok(platform_proxy) = PlatformProxyBlocking::new(&conn).map_err(|e| { @@ -225,90 +210,14 @@ fn do_parsed( Some(CliCommand::Armoury(cmd)) => handle_armoury_command(cmd)?, Some(CliCommand::Backlight(cmd)) => handle_backlight(cmd)?, None => { - if (!parsed.show_supported + if !parsed.show_supported && parsed.kbd_bright.is_none() && parsed.chg_limit.is_none() && !parsed.next_kbd_bright && !parsed.prev_kbd_bright - && !parsed.one_shot_chg) - || parsed.help + && !parsed.one_shot_chg { - println!("{}", CliStart::usage()); - println!(); - if let Some(cmdlist) = CliStart::command_list() { - let dev_type = - if let Ok(proxy) = find_iface::("xyz.ljones.Aura") { - // TODO: commands on all? - proxy - .first() - .unwrap() - .device_type() - .unwrap_or(AuraDeviceType::Unknown) - } else { - AuraDeviceType::Unknown - }; - let commands: Vec = cmdlist.lines().map(|s| s.to_owned()).collect(); - for command in commands.iter().filter(|command| { - if command.trim().starts_with("fan-curve") - && !supported_interfaces.contains(&"xyz.ljones.FanCurves".to_string()) - { - return false; - } - - if command.trim().starts_with("aura") - && !supported_interfaces.contains(&"xyz.ljones.Aura".to_string()) - { - return false; - } - - if command.trim().starts_with("anime") - && !supported_interfaces.contains(&"xyz.ljones.Anime".to_string()) - { - return false; - } - - if command.trim().starts_with("slash") - && !supported_interfaces.contains(&"xyz.ljones.Slash".to_string()) - { - return false; - } - - if command.trim().starts_with("platform") - && !supported_interfaces.contains(&"xyz.ljones.Platform".to_string()) - { - return false; - } - - if command.trim().starts_with("armoury") - && !supported_interfaces.contains(&"xyz.ljones.AsusArmoury".to_string()) - { - return false; - } - - if command.trim().starts_with("backlight") - && !supported_interfaces.contains(&"xyz.ljones.Backlight".to_string()) - { - return false; - } - - if !dev_type.is_old_laptop() - && !dev_type.is_tuf_laptop() - && command.trim().starts_with("aura-power-old") - { - return false; - } - if !dev_type.is_new_laptop() && command.trim().starts_with("aura-power") { - return false; - } - true - }) { - println!("{}", command); - } - } - - println!("\nExtra help can be requested on any command or subcommand:"); - println!(" asusctl aura --help"); - println!(" asusctl aura static --help"); + println!("No command given. Run 'asusctl --help' for usage and 'asusctl --help' for subcommands."); } } } @@ -394,13 +303,10 @@ fn do_gfx() { } fn handle_backlight(cmd: &BacklightCommand) -> Result<(), Box> { - if (cmd.screenpad_brightness.is_none() + if cmd.screenpad_brightness.is_none() && cmd.screenpad_gamma.is_none() - && cmd.sync_screenpad_brightness.is_none()) - || cmd.help + && cmd.sync_screenpad_brightness.is_none() { - println!("Missing arg or command\n\n{}", cmd.self_usage()); - let backlights = find_iface::("xyz.ljones.Backlight")?; for backlight in backlights { println!("Current screenpad settings:"); @@ -434,7 +340,7 @@ fn handle_backlight(cmd: &BacklightCommand) -> Result<(), Box Result<(), Box> { - if (cmd.command.is_none() + if cmd.command.is_none() && cmd.enable_display.is_none() && cmd.enable_powersave_anim.is_none() && cmd.brightness.is_none() @@ -442,13 +348,9 @@ fn handle_anime(cmd: &AnimeCommand) -> Result<(), Box> { && cmd.off_when_suspended.is_none() && cmd.off_when_unplugged.is_none() && cmd.off_with_his_head.is_none() - && !cmd.clear) - || cmd.help + && !cmd.clear { - println!("Missing arg or command\n\n{}", cmd.self_usage()); - if let Some(lst) = cmd.self_command_list() { - println!("\n{}", lst); - } + println!("Missing arg or command; run 'asusctl anime --help' for usage"); } let animes = find_iface::("xyz.ljones.Anime").map_err(|e| { @@ -464,7 +366,7 @@ fn handle_anime(cmd: &AnimeCommand) -> Result<(), Box> { proxy.set_builtins_enabled(enable)?; } if let Some(bright) = cmd.brightness { - proxy.set_brightness(bright)?; + proxy.set_brightness(bright.into())?; } if let Some(enable) = cmd.off_when_lid_closed { proxy.set_off_when_lid_closed(enable)?; @@ -495,11 +397,10 @@ fn handle_anime(cmd: &AnimeCommand) -> Result<(), Box> { if let Some(action) = cmd.command.as_ref() { match action { AnimeActions::Image(image) => { - if image.help_requested() || image.path.is_empty() { - println!("Missing arg or command\n\n{}", image.self_usage()); - if let Some(lst) = image.self_command_list() { - println!("\n{}", lst); - } + if image.path.is_empty() { + println!( + "Missing arg or command; run 'asusctl anime image --help' for usage" + ); return Ok(()); } verify_brightness(image.bright); @@ -516,11 +417,8 @@ fn handle_anime(cmd: &AnimeCommand) -> Result<(), Box> { proxy.write(::try_from(&matrix)?)?; } AnimeActions::PixelImage(image) => { - if image.help_requested() || image.path.is_empty() { - println!("Missing arg or command\n\n{}", image.self_usage()); - if let Some(lst) = image.self_command_list() { - println!("\n{}", lst); - } + if image.path.is_empty() { + println!("Missing arg or command; run 'asusctl anime pixel-image --help' for usage"); return Ok(()); } verify_brightness(image.bright); @@ -535,11 +433,10 @@ fn handle_anime(cmd: &AnimeCommand) -> Result<(), Box> { proxy.write(matrix.into_data_buffer(anime_type)?)?; } AnimeActions::Gif(gif) => { - if gif.help_requested() || gif.path.is_empty() { - println!("Missing arg or command\n\n{}", gif.self_usage()); - if let Some(lst) = gif.self_command_list() { - println!("\n{}", lst); - } + if gif.path.is_empty() { + println!( + "Missing arg or command; run 'asusctl anime gif --help' for usage" + ); return Ok(()); } verify_brightness(gif.bright); @@ -569,11 +466,8 @@ fn handle_anime(cmd: &AnimeCommand) -> Result<(), Box> { } } AnimeActions::PixelGif(gif) => { - if gif.help_requested() || gif.path.is_empty() { - println!("Missing arg or command\n\n{}", gif.self_usage()); - if let Some(lst) = gif.self_command_list() { - println!("\n{}", lst); - } + if gif.path.is_empty() { + println!("Missing arg or command; run 'asusctl anime pixel-gif --help' for usage"); return Ok(()); } verify_brightness(gif.bright); @@ -600,14 +494,8 @@ fn handle_anime(cmd: &AnimeCommand) -> Result<(), Box> { } } AnimeActions::SetBuiltins(builtins) => { - if builtins.help_requested() || builtins.set.is_none() { - println!( - "\nAny unspecified args will be set to default (first shown var)\n" - ); - println!("\n{}", builtins.self_usage()); - if let Some(lst) = builtins.self_command_list() { - println!("\n{}", lst); - } + if builtins.set.is_none() { + println!("Missing arg; run 'asusctl anime set-builtins --help' for usage"); return Ok(()); } @@ -634,24 +522,19 @@ fn verify_brightness(brightness: f32) { } fn handle_slash(cmd: &SlashCommand) -> Result<(), Box> { - if (cmd.brightness.is_none() + if cmd.brightness.is_none() && cmd.interval.is_none() && cmd.show_on_boot.is_none() && cmd.show_on_shutdown.is_none() && cmd.show_on_sleep.is_none() && cmd.show_on_battery.is_none() && cmd.show_battery_warning.is_none() - // && cmd.show_on_lid_closed.is_none() && cmd.mode.is_none() && !cmd.list && !cmd.enable - && !cmd.disable) - || cmd.help + && !cmd.disable { - println!("Missing arg or command\n\n{}", cmd.self_usage()); - if let Some(lst) = cmd.self_command_list() { - println!("\n{}", lst); - } + println!("Missing arg or command; run 'asusctl slash --help' for usage"); } let slashes = find_iface::("xyz.ljones.Slash")?; @@ -702,13 +585,8 @@ fn handle_slash(cmd: &SlashCommand) -> Result<(), Box> { } fn handle_scsi(cmd: &ScsiCommand) -> Result<(), Box> { - if (!cmd.list && cmd.enable.is_none() && cmd.mode.is_none() && cmd.colours.is_empty()) - || cmd.help - { - println!("Missing arg or command\n\n{}", cmd.self_usage()); - if let Some(lst) = cmd.self_command_list() { - println!("\n{}", lst); - } + if !cmd.list && cmd.enable.is_none() && cmd.mode.is_none() && cmd.colours.is_empty() { + println!("Missing arg or command; run 'asusctl scsi --help' for usage"); } let scsis = find_iface::("xyz.ljones.ScsiAura")?; @@ -774,38 +652,15 @@ fn handle_scsi(cmd: &ScsiCommand) -> Result<(), Box> { fn handle_led_mode(mode: &LedModeCommand) -> Result<(), Box> { if mode.command.is_none() && !mode.prev_mode && !mode.next_mode { - if !mode.help { - println!("Missing arg or command\n"); - } - println!("{}\n", mode.self_usage()); - println!("Commands available"); - - if let Some(cmdlist) = LedModeCommand::command_list() { - let commands: Vec = cmdlist.lines().map(|s| s.to_owned()).collect(); - // TODO: multiple rgb check - let aura = find_iface::("xyz.ljones.Aura")?; + println!("Missing arg or command; run 'asusctl aura --help' for usage"); + // print available modes when possible + if let Ok(aura) = find_iface::("xyz.ljones.Aura") { let modes = aura.first().unwrap().supported_basic_modes()?; - for command in commands.iter().filter(|command| { - for mode in &modes { - let mut mode = <&str>::from(mode).to_string(); - if let Some(pos) = mode.chars().skip(1).position(|c| c.is_uppercase()) { - mode.insert(pos + 1, '-'); - } - if command.trim().starts_with(&mode.to_lowercase()) { - return true; - } - } - // TODO - // if !supported.basic_zones.is_empty() && command.trim().starts_with("multi") { - // return true; - // } - false - }) { - println!("{}", command); + println!("Available modes:"); + for m in modes { + println!(" {:?}", m); } } - - println!("\nHelp can also be requested on modes, e.g: static --help"); return Ok(()); } @@ -837,10 +692,6 @@ fn handle_led_mode(mode: &LedModeCommand) -> Result<(), Box::from(mode))?; } @@ -863,10 +714,7 @@ fn handle_led_power1(power: &LedPowerCommand1) -> Result<(), Box Result<(), Box = cmdlist.lines().map(|s| s.to_owned()).collect(); - for command in &commands { - println!("{}", command); - } - } - - println!("\nHelp can also be requested on commands, e.g: boot --help"); return Ok(()); } - if let Some(pow) = power.command.as_ref() { - if pow.help_requested() { - println!("{}", pow.self_usage()); - return Ok(()); - } - + if let Some(_pow) = power.command.as_ref() { let mut states = aura.led_power()?; - let mut set = |zone: PowerZones, set_to: &AuraPowerStates| { - for state in states.states.iter_mut() { - if state.zone == zone { - state.boot = set_to.boot; - state.awake = set_to.awake; - state.sleep = set_to.sleep; - state.shutdown = set_to.shutdown; - break; + let mut set = + |zone: PowerZones, boot_v: bool, awake_v: bool, sleep_v: bool, shutdown_v: bool| { + for state in states.states.iter_mut() { + if state.zone == zone { + state.boot = boot_v; + state.awake = awake_v; + state.sleep = sleep_v; + state.shutdown = shutdown_v; + break; + } } - } - }; + }; if let Some(cmd) = &power.command { match cmd { - aura_cli::SetAuraZoneEnabled::Keyboard(k) => set(PowerZones::Keyboard, k), - aura_cli::SetAuraZoneEnabled::Logo(l) => set(PowerZones::Logo, l), - aura_cli::SetAuraZoneEnabled::Lightbar(l) => set(PowerZones::Lightbar, l), - aura_cli::SetAuraZoneEnabled::Lid(l) => set(PowerZones::Lid, l), - aura_cli::SetAuraZoneEnabled::RearGlow(r) => set(PowerZones::RearGlow, r), - aura_cli::SetAuraZoneEnabled::Ally(r) => set(PowerZones::Ally, r), + aura_cli::SetAuraZoneEnabled::Keyboard(k) => { + set(PowerZones::Keyboard, k.boot, k.awake, k.sleep, k.shutdown) + } + aura_cli::SetAuraZoneEnabled::Logo(l) => { + set(PowerZones::Logo, l.boot, l.awake, l.sleep, l.shutdown) + } + aura_cli::SetAuraZoneEnabled::Lightbar(l) => { + set(PowerZones::Lightbar, l.boot, l.awake, l.sleep, l.shutdown) + } + aura_cli::SetAuraZoneEnabled::Lid(l) => { + set(PowerZones::Lid, l.boot, l.awake, l.sleep, l.shutdown) + } + aura_cli::SetAuraZoneEnabled::RearGlow(r) => { + set(PowerZones::RearGlow, r.boot, r.awake, r.sleep, r.shutdown) + } + aura_cli::SetAuraZoneEnabled::Ally(r) => { + set(PowerZones::Ally, r.boot, r.awake, r.sleep, r.shutdown) + } } } @@ -990,14 +834,7 @@ fn handle_throttle_profile( && cmd.profile_set_ac.is_none() && cmd.profile_set_bat.is_none() { - if !cmd.help { - println!("Missing arg or command\n"); - } - println!("{}", ProfileCommand::usage()); - - if let Some(lst) = cmd.self_command_list() { - println!("\n{}", lst); - } + println!("Missing arg or command; run 'asusctl profile --help' for usage"); return Ok(()); } @@ -1044,14 +881,7 @@ fn handle_fan_curve( }; if !cmd.get_enabled && !cmd.default && cmd.mod_profile.is_none() { - if !cmd.help { - println!("Missing arg or command\n"); - } - println!("{}", FanCurveCommand::usage()); - - if let Some(lst) = cmd.self_command_list() { - println!("\n{}", lst); - } + println!("Missing arg or command; run 'asusctl fan-curve --help' for usage"); return Ok(()); } @@ -1191,7 +1021,7 @@ fn print_firmware_attr(attr: &AsusArmouryProxyBlocking) -> Result<(), Box Result<(), Box> { { - if cmd.free.is_empty() || (cmd.free.len() % 2 != 0) || cmd.help { + if cmd.free.is_empty() || (cmd.free.len() % 2 != 0) { const USAGE: &str = "Usage: asusctl armoury panel_overdrive 1 nv_dynamic_boost 5"; if cmd.free.len() % 2 != 0 { println!( diff --git a/asusctl/src/scsi_cli.rs b/asusctl/src/scsi_cli.rs index ef87d3c1..c4ae3661 100644 --- a/asusctl/src/scsi_cli.rs +++ b/asusctl/src/scsi_cli.rs @@ -1,35 +1,30 @@ -use gumdrop::Options; +use argh::FromArgs; use rog_scsi::{AuraMode, Colour, Direction, Speed}; -#[derive(Options)] +#[derive(FromArgs, Debug)] +#[argh(subcommand, name = "scsi", description = "scsi LED commands")] pub struct ScsiCommand { - #[options(help = "print help message")] - pub help: bool, - - #[options(help = "Enable the SCSI drive LEDs")] + #[argh(option, description = "enable the SCSI drive LEDs")] pub enable: Option, - #[options(meta = "", help = "Set LED mode (so 'list' for all options)")] + #[argh(option, description = "set LED mode (use 'list' for all options)")] pub mode: Option, - #[options( - meta = "", - help = "Set LED mode speed (does not apply to all)" + #[argh( + option, + description = "set LED mode speed " )] pub speed: Option, - #[options( - meta = "", - help = "Set LED mode direction (does not apply to all)" - )] + #[argh(option, description = "set LED mode direction ")] pub direction: Option, - #[options( - meta = "", - help = "Set LED colours , specify up to 4 with repeated arg" + #[argh( + option, + description = "set LED colours , specify up to 4 with repeated arg" )] pub colours: Vec, - #[options(help = "list available animations")] + #[argh(switch, description = "list available animations")] pub list: bool, } diff --git a/asusctl/src/slash_cli.rs b/asusctl/src/slash_cli.rs index fec5d8f2..728f8292 100644 --- a/asusctl/src/slash_cli.rs +++ b/asusctl/src/slash_cli.rs @@ -1,37 +1,34 @@ -use gumdrop::Options; +use argh::FromArgs; use rog_slash::SlashMode; -#[derive(Options)] +#[derive(FromArgs, Debug)] +#[argh(subcommand, name = "slash", description = "slash ledbar commands")] pub struct SlashCommand { - #[options(help = "print help message")] - pub help: bool, - #[options(help = "Enable the Slash Ledbar")] + #[argh(switch, description = "enable the Slash Ledbar")] pub enable: bool, - #[options(help = "Disable the Slash Ledbar")] + #[argh(switch, description = "disable the Slash Ledbar")] pub disable: bool, - #[options(short = "l", meta = "", help = "Set brightness value <0-255>")] + #[argh(option, short = 'l', description = "set brightness value <0-255>")] pub brightness: Option, - #[options(meta = "", help = "Set interval value <0-5>")] + #[argh(option, description = "set interval value <0-5>")] pub interval: Option, - #[options(meta = "", help = "Set SlashMode (so 'list' for all options)")] + #[argh(option, description = "set SlashMode (use 'list' for options)")] pub mode: Option, - #[options(help = "list available animations")] + #[argh(switch, description = "list available animations")] pub list: bool, - #[options(short = "B", meta = "", help = "Show the animation on boot")] + #[argh(option, short = 'B', description = "show the animation on boot")] pub show_on_boot: Option, - #[options(short = "S", meta = "", help = "Show the animation on shutdown")] + #[argh(option, short = 'S', description = "show the animation on shutdown")] pub show_on_shutdown: Option, - #[options(short = "s", meta = "", help = "Show the animation on sleep")] + #[argh(option, short = 's', description = "show the animation on sleep")] pub show_on_sleep: Option, - #[options(short = "b", meta = "", help = "Show the animation on battery")] + #[argh(option, short = 'b', description = "show the animation on battery")] pub show_on_battery: Option, - // #[options(short = "L", meta = "", help = "Show the animation on lid closed")] - // pub show_on_lid_closed: Option, - #[options( - short = "w", - meta = "", - help = "Show the low-battery warning animation" + #[argh( + option, + short = 'w', + description = "show the low-battery warning animation" )] pub show_battery_warning: Option, }