use std::process::ExitCode;
use clap::{Args, Parser, Subcommand};
#[derive(Debug, Parser, Clone)]
#[command(version)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Debug, Args, Clone)]
struct VarValue {
var: String,
#[arg(allow_hyphen_values = true)]
value: String,
}
#[derive(Debug, Subcommand, Clone)]
enum Commands {
Set(VarValue),
SetExpandString(VarValue),
Get { var: String },
Remove { var: String },
Exists(VarValue),
Append(VarValue),
Prepend(VarValue),
RemoveFromList(VarValue),
}
fn main() -> ExitCode {
match run() {
Ok(code) => code,
Err(e) => {
eprintln!("error: {e}");
ExitCode::FAILURE
},
}
}
fn run() -> windows_env::Result<ExitCode> {
match Cli::parse().command {
Commands::Set(VarValue { var, value }) => {
windows_env::set(&var, &value)?;
println!("{var}={value}");
},
Commands::SetExpandString(VarValue { var, value }) => {
windows_env::set_expand_string(&var, &value)?;
println!("{var}={value} (REG_EXPAND_SZ)");
},
Commands::Get { var } => {
if let Some(value) = windows_env::get(&var)? {
println!("{value}");
} else {
eprintln!("{var} not found");
return Ok(ExitCode::FAILURE);
}
},
Commands::Remove { var } => {
windows_env::remove(&var)?;
println!("{var} removed");
},
Commands::Exists(VarValue { var, value }) => {
let exists = windows_env::exists_in_list(&var, &value)?;
println!("{exists}");
if !exists {
return Ok(ExitCode::FAILURE);
}
},
Commands::Append(VarValue { var, value }) => {
windows_env::append(&var, &value)?;
println!("appended: {value} to {var}");
},
Commands::Prepend(VarValue { var, value }) => {
windows_env::prepend(&var, &value)?;
println!("prepended: {value} to {var}");
},
Commands::RemoveFromList(VarValue { var, value }) => {
if windows_env::remove_from_list(&var, &value)? {
println!("removed: {value} from {var}");
} else {
eprintln!("{value} not found in {var}");
return Ok(ExitCode::FAILURE);
}
},
}
Ok(ExitCode::SUCCESS)
}