diff options
author | Benedikt Peetz <benedikt.peetz@b-peetz.de> | 2025-04-14 13:32:15 +0200 |
---|---|---|
committer | Benedikt Peetz <benedikt.peetz@b-peetz.de> | 2025-04-14 13:32:15 +0200 |
commit | 5e1362e4f73328ecbace995c2892f01b9a62e0b9 (patch) | |
tree | 8e7362893d22ac95e431ec66d2ed9fa6094a5d34 /pkgs/by-name/fu/fupdate/src/cli.rs | |
parent | pkgs/fupdate: Split into `fupdate-flake` and `fupdate` (diff) | |
download | nixos-config-5e1362e4f73328ecbace995c2892f01b9a62e0b9.zip |
pkgs/fupdate: Rewrite in rust
Diffstat (limited to 'pkgs/by-name/fu/fupdate/src/cli.rs')
-rw-r--r-- | pkgs/by-name/fu/fupdate/src/cli.rs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/pkgs/by-name/fu/fupdate/src/cli.rs b/pkgs/by-name/fu/fupdate/src/cli.rs new file mode 100644 index 00000000..6f970ac4 --- /dev/null +++ b/pkgs/by-name/fu/fupdate/src/cli.rs @@ -0,0 +1,46 @@ +use std::{env, ffi::OsStr, fs::read_dir}; + +use clap::Parser; +use clap_complete::{engine::ArgValueCompleter, CompletionCandidate}; + +/// This is a Nix flake update manager. +#[derive(Parser, Debug)] +#[command(author, version, about)] +pub struct CliArgs { + /// The command to execute. + #[arg(add = ArgValueCompleter::new(get_fupdate_commands))] + pub command: Vec<String>, +} + +fn get_fupdate_commands(current: &OsStr) -> Vec<CompletionCandidate> { + let mut output = vec![]; + let path = env::var("PATH").unwrap_or_default(); + + let Some(current) = current.to_str() else { + return output; + }; + + for directory in path.split(':') { + if let Ok(mut read) = read_dir(directory) { + for value in read.by_ref().flatten() { + let file_name = value.file_name(); + let name = file_name.to_string_lossy(); + let Some(stripped) = name.strip_prefix("fupdate-") else { + continue; + }; + + if stripped.starts_with(current) { + output.push(CompletionCandidate::new( + value + .file_name() + .to_string_lossy() + .strip_prefix("fupdate-") + .expect("Exists"), + )); + } + } + } + } + + output +} |