Shell completions
This commit is contained in:
parent
89be84860d
commit
dbd4563e77
63
completions/bash
Normal file
63
completions/bash
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
#/usr/bin/env bash
|
||||||
|
|
||||||
|
_remove_opts() {
|
||||||
|
local opt new_opts
|
||||||
|
for opt in ${available_opts}; do
|
||||||
|
if [[ $opt != $1 && $opt != $2 ]]; then
|
||||||
|
new_opts+="$opt "
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
available_opts=$new_opts
|
||||||
|
}
|
||||||
|
|
||||||
|
_doby_completion() {
|
||||||
|
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||||
|
local opts="-f --force-encrypt -i --interactive -h --help -V --version --password -t --time-cost -m --memory-cost -p --parallelism -b --block-size -c --cipher"
|
||||||
|
if [[ ${cur} == -* ]]; then
|
||||||
|
local i available_opts=$opts
|
||||||
|
for i in ${COMP_WORDS[@]}; do
|
||||||
|
if [[ ${opts[*]} =~ $i ]]; then
|
||||||
|
case $i in
|
||||||
|
"-f"|"--force-encrypt")
|
||||||
|
_remove_opts "-f" "--force-encrypt"
|
||||||
|
;;
|
||||||
|
"-i"|"--interactive")
|
||||||
|
_remove_opts "-i" "--interactive"
|
||||||
|
;;
|
||||||
|
"-h"|"--help")
|
||||||
|
_remove_opts "-h" "--help"
|
||||||
|
;;
|
||||||
|
"-V"|"--version")
|
||||||
|
_remove_opts "-V" "--version"
|
||||||
|
;;
|
||||||
|
"--password")
|
||||||
|
_remove_opts "--password"
|
||||||
|
;;
|
||||||
|
"-t"|"--time-cost")
|
||||||
|
_remove_opts "-t" "--time-cost"
|
||||||
|
;;
|
||||||
|
"-m"|"--memory-cost")
|
||||||
|
_remove_opts "-m" "--memory-cost"
|
||||||
|
;;
|
||||||
|
"-p"|"--parallelism")
|
||||||
|
_remove_opts "-p" "--parallelism"
|
||||||
|
;;
|
||||||
|
"-b"|"--block-size")
|
||||||
|
_remove_opts "-b" "--block-size"
|
||||||
|
;;
|
||||||
|
"-c"|"--cipher")
|
||||||
|
_remove_opts "-c" "--cipher"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
COMPREPLY=($(compgen -W "${available_opts}" -- "${cur}"))
|
||||||
|
else
|
||||||
|
local prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||||
|
if [[ ${prev} == "-c" || ${prev} == "--cipher" ]]; then
|
||||||
|
COMPREPLY=($(compgen -W "aes xchacha20" -- "${cur}"))
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
complete -F _doby_completion -o bashdefault -o default doby
|
19
completions/zsh
Normal file
19
completions/zsh
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#compdef doby
|
||||||
|
|
||||||
|
function _doby {
|
||||||
|
_arguments \
|
||||||
|
'(-f --force-encrypt)'{-f,--force-encrypt}'[Encrypt even if doby format is recognized]' \
|
||||||
|
'(-i --interactive)'{-i,--interactive}'[Prompt before overwriting files]' \
|
||||||
|
'(: * -)'{-h,--help}'[Prints help information]' \
|
||||||
|
'(: * -)'{-V,--version}'[Prints version information]' \
|
||||||
|
'--password=[Password used to derive encryption keys]' \
|
||||||
|
'(-t --time-cost)'{-t,--time-cost}'[Argon2 time cost]' \
|
||||||
|
'(-m --memory-cost)'{-m,--memory-cost}'[Argon2 memory cost (in kilobytes)]' \
|
||||||
|
'(-p --parallelism)'{-p,--parallelism}'[Argon2 parallelism cost]' \
|
||||||
|
'(-b --block-size)'{-b,--block-size}'[Size of the I/O buffer (in bytes)]' \
|
||||||
|
'(-c --cipher)'{-c,--cipher}'[Encryption cipher to use]: :(aes xchacha20)' \
|
||||||
|
':::_files' \
|
||||||
|
':::_files' \
|
||||||
|
}
|
||||||
|
|
||||||
|
_doby "$@"
|
17
src/bin/compgen.rs
Normal file
17
src/bin/compgen.rs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
use std::{env, io};
|
||||||
|
use clap::Shell;
|
||||||
|
use doby::cli;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut args = env::args().skip(1);
|
||||||
|
if let Some(shell) = args.next() {
|
||||||
|
if let Ok(shell) = shell.parse() {
|
||||||
|
cli::app().gen_completions_to("doby", shell, &mut io::stdout());
|
||||||
|
} else {
|
||||||
|
eprintln!("error: invalid shell: {}", shell);
|
||||||
|
eprintln!("shell variants: {:?}", Shell::variants());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
eprintln!("usage: compgen <shell>");
|
||||||
|
}
|
||||||
|
}
|
11
src/cli.rs
11
src/cli.rs
@ -31,8 +31,8 @@ impl From<CliArgs> for ParseResult {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse() -> Option<ParseResult> {
|
pub fn app<'a>() -> App<'a, 'a> {
|
||||||
let app = App::new(crate_name!())
|
App::new(crate_name!())
|
||||||
.version(crate_version!())
|
.version(crate_version!())
|
||||||
.setting(AppSettings::ColoredHelp)
|
.setting(AppSettings::ColoredHelp)
|
||||||
.about("Secure symmetric encryption from the command line.")
|
.about("Secure symmetric encryption from the command line.")
|
||||||
@ -42,7 +42,7 @@ pub fn parse() -> Option<ParseResult> {
|
|||||||
Arg::with_name("1_force_encrypt")
|
Arg::with_name("1_force_encrypt")
|
||||||
.short("f")
|
.short("f")
|
||||||
.long("force-encrypt")
|
.long("force-encrypt")
|
||||||
.help(&format!("Encrypt even if {} format is recognized", crate_name!()))
|
.help(concat!("Encrypt even if ", crate_name!(), " format is recognized"))
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("2_interactive")
|
Arg::with_name("2_interactive")
|
||||||
@ -97,7 +97,10 @@ pub fn parse() -> Option<ParseResult> {
|
|||||||
.possible_values(&["aes", "xchacha20"])
|
.possible_values(&["aes", "xchacha20"])
|
||||||
.case_insensitive(true)
|
.case_insensitive(true)
|
||||||
)
|
)
|
||||||
.get_matches();
|
}
|
||||||
|
|
||||||
|
pub fn parse() -> Option<ParseResult> {
|
||||||
|
let app = app().get_matches();
|
||||||
|
|
||||||
let params = {
|
let params = {
|
||||||
let t_cost = number(app.value_of("2_t_cost").unwrap())?;
|
let t_cost = number(app.value_of("2_t_cost").unwrap())?;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user