feat(src): Introduce full CLI interface for laptop hardware management
Add clap‑based CLI with subcommands (gpu, battery, power, status), verbose flag, and detailed options such as rtd3, use_nvidia_current, etc. - New Features - New CLI entry point with complete subcommand hierarchy - Verbose logging support - Granular command options for GPU, Battery, Power, Status - Enhancements - Replace placeholder hello world with proper logging initialization - Modularize command implementations into dedicated modules
This commit is contained in:
2 files changed
+131
-1
No files matched your search
+102
@@ -0,0 +1,102 @@
|
||||
use clap::{Parser, Subcommand};
|
||||
|
||||
#[derive(Parser, Debug)]
|
||||
#[command(
|
||||
name = "lapctl",
|
||||
version,
|
||||
about = "CLI utility for managing laptop hardware features on Linux."
|
||||
)]
|
||||
pub struct Cli {
|
||||
#[command(subcommand)]
|
||||
pub command: Commands,
|
||||
|
||||
/// Enable verbose logging
|
||||
#[arg(short, long, global = true)]
|
||||
pub verbose: bool,
|
||||
}
|
||||
|
||||
#[derive(Subcommand, Debug)]
|
||||
pub enum Commands {
|
||||
/// GPU management commands
|
||||
Gpu {
|
||||
#[command(subcommand)]
|
||||
command: GpuCommands,
|
||||
},
|
||||
/// Battery management commands
|
||||
Battery {
|
||||
#[command(subcommand)]
|
||||
command: BatteryCommands,
|
||||
},
|
||||
/// Power management commands
|
||||
Power {
|
||||
#[command(subcommand)]
|
||||
command: PowerCommands,
|
||||
},
|
||||
/// Hardware status
|
||||
Status,
|
||||
}
|
||||
|
||||
#[derive(Subcommand, Debug)]
|
||||
pub enum GpuCommands {
|
||||
/// Query the current graphics mode
|
||||
Query,
|
||||
/// Switch to integrated graphics
|
||||
Integrated,
|
||||
/// Switch to hybrid graphics
|
||||
Hybrid {
|
||||
/// Setup PCI-Express Runtime D3 (RTD3) Power Management on Hybrid mode (0, 1, 2, 3)
|
||||
#[arg(long)]
|
||||
rtd3: Option<u8>,
|
||||
/// Use nvidia-current instead of nvidia for kernel modules
|
||||
#[arg(long)]
|
||||
use_nvidia_current: bool,
|
||||
},
|
||||
/// Switch to NVIDIA graphics
|
||||
Nvidia {
|
||||
/// Manually specify your Display Manager (gdm, sddm, lightdm)
|
||||
#[arg(long)]
|
||||
dm: Option<String>,
|
||||
/// Enable ForceCompositionPipeline on Nvidia mode
|
||||
#[arg(long)]
|
||||
force_comp: bool,
|
||||
/// Enable Coolbits on Nvidia mode
|
||||
#[arg(long)]
|
||||
coolbits: Option<u32>,
|
||||
/// Use nvidia-current instead of nvidia for kernel modules
|
||||
#[arg(long)]
|
||||
use_nvidia_current: bool,
|
||||
/// Set up Nvidia mode for Wayland (skips Xorg configuration)
|
||||
#[arg(long)]
|
||||
wayland: bool,
|
||||
},
|
||||
/// Revert changes made by lapctl
|
||||
Reset,
|
||||
/// Restore default sddm Xsetup file
|
||||
ResetSddm,
|
||||
/// Create cache used by lapctl (hybrid mode only)
|
||||
CacheCreate,
|
||||
/// Delete cache created by lapctl
|
||||
CacheDelete,
|
||||
/// Show cache created by lapctl
|
||||
CacheQuery,
|
||||
}
|
||||
|
||||
#[derive(Subcommand, Debug)]
|
||||
pub enum PowerCommands {
|
||||
/// Set power profile to performance
|
||||
Performance,
|
||||
/// Set power profile to balanced
|
||||
Balanced,
|
||||
/// Set power profile to battery saver
|
||||
BatterySave,
|
||||
}
|
||||
|
||||
#[derive(Subcommand, Debug)]
|
||||
pub enum BatteryCommands {
|
||||
/// Set the battery charging limit (e.g., 80)
|
||||
Limit {
|
||||
percent: u8,
|
||||
},
|
||||
/// Show current battery status
|
||||
Status,
|
||||
}
|
||||
+29
-1
@@ -1,3 +1,31 @@
|
||||
use clap::Parser;
|
||||
|
||||
mod cli;
|
||||
mod commands;
|
||||
mod hardware;
|
||||
mod utils;
|
||||
|
||||
use cli::{Cli, Commands};
|
||||
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
let cli = Cli::parse();
|
||||
|
||||
let level = if cli.verbose {
|
||||
log::LevelFilter::Debug
|
||||
} else {
|
||||
log::LevelFilter::Info
|
||||
};
|
||||
|
||||
env_logger::Builder::new()
|
||||
.filter_level(level)
|
||||
.format_timestamp(None)
|
||||
.format_module_path(false)
|
||||
.init();
|
||||
|
||||
match &cli.command {
|
||||
Commands::Gpu { command } => commands::gpu::execute(command),
|
||||
Commands::Battery { command } => commands::battery::execute(command),
|
||||
Commands::Power { command } => commands::power::execute(command),
|
||||
Commands::Status => commands::status::execute(),
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user