Work on hydra completion

Now supports both syntaxes

Currently, doesn't tab complete service options but does show help
Jonathan Hodgson 5 years ago
parent a7cc3123ac
commit 180d8cd21b
  1. 102
      shells/zsh/completion/_hydra

@ -84,7 +84,12 @@ min_max_charset(){
} }
service_help(){ service_help(){
_message -r "${hydra -U $previousArg}" if [ "$1" = "new" ]; then
service="$( echo "${tokens[-1]}" | cut -d':' -f1)"
_message -r "$(hydra -U $service)"
else
_message -r "$(hydra -U $previousArg)"
fi
} }
service_list(){ service_list(){
_describe "Services" services _describe "Services" services
@ -149,14 +154,87 @@ done
local -a line expl local -a line expl
local -i ret=1 local -i ret=1
typeset -A opt_args typeset -A opt_args
_arguments -C -s "${args[@]}" ':service:->hydra_service' && return
case $state in
hydra_service) # Hydra has 2 syntaxes. They are:
if compset -P "(${(j:|:)services})://"; then #
_wanted servers expl 'server' _hosts && ret=0 # hydra [some command line options] [-s PORT] TARGET PROTOCOL [MODULE-OPTIONS]
else # or
_wanted services expl $state_descr compadd -S '://' -q -a services && ret=0 # hydra [some command line options] PROTOCOL://TARGET:PORT/MODULE-OPTIONS
fi #
;; # The protocol:// option is considered the new version but can only be used if there is 1 target
esac
newSyntax="either"
targetNeeded="true"
# If the -M option is given, we need to use the old syntax
if (( ${tokens[(I)-M]} )); then
newSyntax="false"
targetNeeded="false"
fi
if $(echo "$BUFFER" | grep -Eq "(${(j:|:)services}) "); then
newSyntax="false"
fi
#if [ "$newSyntax" != "false" ]; then
# _arguments -C -s "${args[@]}" ':service:->hydra_service' && return
# case $state in
# hydra_service)
# if compset -P "(${(j:|:)services})://*/"; then
# service_help "new"
# elif compset -P "(${(j:|:)services})://*:"; then
# _message -r "service://host:port/options"
# elif compset -P "(${(j:|:)services})://"; then
# _hosts -S ':' && ret=0
# else
# compadd -S '://' -q -a services && ret=0
# fi
# ;;
# esac
#else
_arguments -C -s "${args[@]}" ':target:->param1' ':service:->param2' ':options:->param3' && return
case $state in
param1)
if [ "$newSyntax" != "false" ]; then
if compset -P "(${(j:|:)services})://*/"; then
newSyntax="true"
service_help "new"
elif compset -P "(${(j:|:)services})://*:"; then
_message -r "service://host:port/options"
newSyntax="true"
elif compset -P "(${(j:|:)services})://"; then
_hosts -S ':'
newSyntax="true"
else
compadd -S '://' -q -a services
fi
fi
if [ "$newSyntax" != "true" ]; then
if [ "$targetNeeded" = "true" ]; then
_hosts
else
compadd -q -a services
fi
fi
;;
param2)
if [ "$newSyntax" != "true" ]; then
if [ "$targetNeeded" = "true" ]; then
compadd -q -a services
else
service_help
fi
fi
;;
param3)
if [ "$newSyntax" != "true" ]; then
if [ "$targetNeeded" = "true" ]; then
service_help
fi
fi
;;
esac
#fi

Loading…
Cancel
Save