use heck::ToShoutySnakeCase;
pub fn complete_bash(bin: &str, usage_cmd: &str) -> String {
let bin_up = bin.to_shouty_snake_case();
format!(
r#"
_{bin}() {{
if ! command -v usage &> /dev/null; then
echo >&2
echo "Error: usage CLI not found. This is required for completions to work in {bin}." >&2
echo "See https://usage.jdx.dev for more information." >&2
return 1
fi
if [[ -z ${{_USAGE_SPEC_{bin_up}:-}} ]]; then
_USAGE_SPEC_{bin_up}="$({usage_cmd})"
fi
COMPREPLY=( $(usage complete-word --shell bash -s "${{_USAGE_SPEC_{bin_up}}}" --cword="$COMP_CWORD" -- "${{COMP_WORDS[@]}}" ) )
if [[ $? -ne 0 ]]; then
unset COMPREPLY
fi
return 0
}}
shopt -u hostcomplete && complete -o nospace -o bashdefault -o nosort -F _{bin} {bin}
# vim: noet ci pi sts=0 sw=4 ts=4 ft=sh
"#
)
}
#[cfg(test)]
mod tests {
use super::*;
use insta::assert_snapshot;
#[test]
fn test_complete_bash() {
assert_snapshot!(complete_bash("mycli", "mycli complete --usage").trim(), @r###"
_mycli() {
if ! command -v usage &> /dev/null; then
echo >&2
echo "Error: usage CLI not found. This is required for completions to work in mycli." >&2
echo "See https://usage.jdx.dev for more information." >&2
return 1
fi
if [[ -z ${_USAGE_SPEC_MYCLI:-} ]]; then
_USAGE_SPEC_MYCLI="$(mycli complete --usage)"
fi
COMPREPLY=( $(usage complete-word --shell bash -s "${_USAGE_SPEC_MYCLI}" --cword="$COMP_CWORD" -- "${COMP_WORDS[@]}" ) )
if [[ $? -ne 0 ]]; then
unset COMPREPLY
fi
return 0
}
shopt -u hostcomplete && complete -o nospace -o bashdefault -o nosort -F _mycli mycli
# vim: noet ci pi sts=0 sw=4 ts=4 ft=sh
"###);
}
}