Crystalnix/termius-cli

View on GitHub
contrib/completion/bash/termius

Summary

Maintainability
Test Coverage
__termius_entity_labels() {
  termius $1 -f value -c label
}

__termius_get_labels_ids() {
  case $1 in
    host|group|key|pfrule|snippet)
      __termius_entity_labels "$1"s
      ;;
    identity)
      __termius_entity_labels identities
      ;;
    *) return 0
      ;;
  esac
}

__termius_subcommand_instance() {
  case $1 in
    host|group|identity|key|pfrule|snippet)
      __termius_get_labels_ids $1
      ;;
    connect)
      __termius_complete_connect
      ;;
    info)
     __termius_complete_info
      ;;
    *) return 0
      ;;
  esac
}

__termius_complete_option_value() {
  local completion
  completion="__termius_complete_options_$1"
  if ! type $completion >/dev/null 2>&1; then
    __termius_complete_common_options $2
  else
    $completion $2
  fi
}

__termius_complete_connect() {
  if [[ " ${words[@]} " =~ " -R " ]] || [[ " ${words[@]} " =~ " --pfrule " ]]; then
    __termius_get_labels_ids pfrule
  else
    __termius_get_labels_ids host
  fi
}

__termius_complete_info() {
  if [[ " ${words[@]} " =~ " -g " ]] || [[ " ${words[@]} " =~ " --group " ]]; then
    __termius_get_labels_ids group
  else
    __termius_get_labels_ids host
  fi
}

__termius_complete_options_complete() {
  case $1 in
    --shell)
      echo bash
      ;;
    --name)
      echo termius
      ;;
    *)
      return 0
      ;;
  esac
}
__termius_complete_options_connect() {
  return 0
}
__termius_complete_options_fullclean() {
  __termius_complete_common_options $1
}
__termius_complete_options_group() {
  case $1 in
    -g|--parent-group)
      __termius_get_labels_ids group
      ;;
    -s|--snippet)
      __termius_get_labels_ids snippet
      ;;
    --identity)
      __termius_get_labels_ids identity
      ;;
    *)
      __termius_complete_common_options $1
      ;;
  esac
}
__termius_complete_options_groups() {
  __termius_complete_common_list_options $1
}
__termius_complete_options_help() {
  return 0
}
__termius_complete_options_host() {
  case $1 in
    -g|--group)
      __termius_get_labels_ids group
      ;;
    -t|--tag)
      __termius_get_labels_ids tag
      ;;
    -s|--snippet)
      __termius_get_labels_ids snippet
      ;;
    --identity)
      __termius_get_labels_ids identity
      ;;
    *)
      __termius_complete_common_options $1
      ;;
  esac
}
__termius_complete_options_hosts() {
  case $1 in
    -g|--group)
      __termius_get_labels_ids group
      ;;
    -t|--tag)
      __termius_get_labels_ids tag
      ;;
    *)
      __termius_complete_common_list_options $1
      ;;
  esac
}
__termius_complete_options_identities() {
  __termius_complete_common_list_options $1
}
__termius_complete_options_identity() {
  case $1 in
    -k|--ssh-key)
      __termius_get_labels_ids key
      ;;
    *)
      __termius_complete_common_options $1
      ;;
  esac
}
__termius_complete_options_info() {
   case $1 in
    -f|--format)
      echo json shell ssh table value yaml
      ;;
    *)
      __termius_complete_common_options $1
      ;;
  esac
}
__termius_complete_options_keys() {
  __termius_complete_common_list_options $1
}
__termius_complete_options_pfrule() {
   case $1 in
    -H|--host)
      __termius_get_labels_ids host
      ;;
    *)
      __termius_complete_common_options $1
      ;;
  esac
}
__termius_complete_options_pfrules() {
  __termius_complete_common_list_options $1
}
__termius_complete_options_snippets() {
  __termius_complete_common_list_options $1
}
__termius_complete_options_tags() {
  __termius_complete_common_list_options $1
}

__termius_complete_common_list_options() {
  case $1 in
    -f|--format)
      echo csv json table value yaml
      ;;
    *)
      __termius_complete_common_options $1
      ;;
  esac
}

__termius_complete_common_options() {
  return 0
}

_termius()
{
  local cur prev words
  COMPREPLY=()
  _get_comp_words_by_ref -n : cur prev words

  # Command data:
  cmds='complete connect fullclean group groups help host hosts identities identity info init key keys login logout pfrule pfrules pull push snippet snippets import-ssh-config export-ssh-config tags settings'
  cmds_complete='-h --help --name --shell'
  cmds_complete_arg_options='--name --shell'
  cmds_settings='-h --help --synchronize-key --agent-forwarding --log-file'
  cmds_settings_arg_options='--synchronize-key --agent-forwarding --log-file'
  cmds_settings_file_options='--log-file'
  cmds_connect='-h --help --log-file -R --pfrule -H --host'
  cmds_connect_arg_options='--log-file'
  cmds_connect_file_options='--log-file'
  cmds_fullclean='-h --help --log-file -p --password'
  cmds_fullclean_arg_options='--log-file -p --password'
  cmds_fullclean_file_options='--log-file'
  cmds_group='-h --help --log-file -g --parent-group -p --port -s --snippet --identity -S --strict-host-key-check -T --timeout --use-ssh-key -k --keep-alive-packages -u --username -P --password -i --identity-file -d --delete -L --label'
  cmds_group_arg_options='--log-file -g --parent-group -p --port -s --snippet --identity -u --username -P --password -i --identity-file -L --label -S --strict-host-key-check -T --timeout --use-ssh-key -k --keep-alive-packages'
  cmds_group_file_options='--log-file -i --identity-file'
  cmds_groups='-h --help -f --format -c --column --max-width --noindent --quote --log-file -r --recursive'
  cmds_groups_arg_options='-f --format -c --column --max-width --log-file'
  cmds_groups_file_options='--log-file'
  cmds_help='-h --help'
  cmds_host='-h --help --log-file -t --tag -g --group -a --address -p --port -s --snippet --identity -u --username -i --identity-file -d --delete -L --label -S --strict-host-key-check -T --timeout --use-ssh-key -k --keep-alive-packages'
  cmds_host_arg_options='--log-file -t --tag -g --group -a --address -p --port -s --snippet --identity -u --username -i --identity-file -L --label -S --strict-host-key-check -T --timeout --use-ssh-key -k --keep-alive-packages'
  cmds_host_file_options='--log-file -i --identity-file'
  cmds_hosts='-h --help -f --format -c --column --max-width --noindent --quote --log-file -t --tag -g --group'
  cmds_hosts_arg_options='-f --format -c --column --max-width --log-file -t --tag -g --group'
  cmds_hosts_file_options='--log-file'
  cmds_identities='-h --help -f --format -c --column --max-width --noindent --quote --log-file'
  cmds_identities_arg_options='-f --format -c --column --max-width --log-file'
  cmds_identities_file_options='--log-file'
  cmds_identity='-h --help --log-file -u --username -i --identity-file -k --ssh-key -d --delete -L --label'
  cmds_identity_arg_options='--log-file -u --username -i --identity-file -k --ssh-key -L --label'
  cmds_identity_file_options='--log-file -i --identity-file'
  cmds_info='-h --help --log-file -G --group -H --host -M --no-merge -f --format -c --column --prefix --noindent --address --max-width'
  cmds_info_arg_options='--log-file -f --format -c --column --prefix --address'
  cmds_info_file_options='--log-file'
  cmds_init='-h --help --log-file -u --username -p --password'
  cmds_init_arg_options='--log-file -u --username -p --password'
  cmds_init_file_options='--log-file'
  cmds_key='-h --help --log-file -i --identity-file -d --delete -L --label'
  cmds_key_arg_options='--log-file -i --identity-file -L --label'
  cmds_key_file_options='--log-file -i --identity-file'
  cmds_keys='-h --help -f --format -c --column --max-width --noindent --quote --log-file'
  cmds_keys_arg_options='-f --format -c --column --max-width --log-file'
  cmds_keys_file_options='--log-file'
  cmds_login='-h --help --log-file -u --username -p --password'
  cmds_login_arg_options='--log-file -u --username -p --password'
  cmds_login_file_options='--log-file'
  cmds_logout='-h --help --log-file'
  cmds_logout_arg_options='--log-file'
  cmds_logout_file_options='--log-file'
  cmds_pfrule='-h --help --log-file -H --host --dynamic --remote --local --binding -d --delete -L --label'
  cmds_pfrule_arg_options='--log-file -H --host --binding -L --label'
  cmds_pfrule_file_options='--log-file'
  cmds_pfrules='-h --help -f --format -c --column --max-width --noindent --quote --log-file'
  cmds_pfrules_arg_options='-f --format -c --column --max-width --log-file'
  cmds_pfrules_file_options='--log-file'
  cmds_pull='-h --help --log-file -p --password'
  cmds_pull_arg_options='--log-file -p --password'
  cmds_pull_file_options='--log-file'
  cmds_push='-h --help --log-file -p --password'
  cmds_push_arg_options='--log-file -p --password'
  cmds_push_file_options='--log-file'
  cmds_snippet='-h --help --log-file -s --script -d --delete -L --label'
  cmds_snippet_arg_options='--log-file -s --script -L --label'
  cmds_snippet_file_options='--log-file'
  cmds_snippets='-h --help -f --format -c --column --max-width --noindent --quote --log-file'
  cmds_snippets_arg_options='-f --format -c --column --max-width --log-file'
  cmds_snippets_file_options='--log-file'
  cmds_import-ssh-config='-h --help --log-file'
  cmds_import-ssh-config_arg_options='--log-file'
  cmds_import-ssh-config_file_options='--log-file'
  cmds_export-ssh-config='-h --help --log-file'
  cmds_export-ssh-config_arg_options='--log-file'
  cmds_export-ssh-config_file_options='--log-file'
  cmds_tags='-h --help -f --format -c --column --max-width --noindent --quote --log-file -d --delete'
  cmds_tags_arg_options='-f --format -c --column --max-width --log-file'
  cmds_tags_file_options='--log-file'

  cmd=""
  words[0]=""
  completed_options="${cmds}"
  for var in "${words[@]:1}"
  do
    if [[ ${var} == -* ]] ; then
      break
    fi
    if [ -z "${cmd}" ] ; then
      proposed="${var}"
    else
      proposed="${cmd}_${var}"
    fi
    local i="cmds_${proposed}"
    local comp="${!i}"
    if [ -z "${comp}" ] ; then
      break
    fi
    if [[ ${comp} == -* ]] ; then
      if [[ ${cur} != -* ]] ; then
        completed_options=""
        break
      fi
    fi
    cmd="${proposed}"
    completed_options="${comp}"
  done

  subcommand=${words[1]}
  arg_options="cmds_${subcommand}_arg_options"
  arg_file_options="cmds_${subcommand}_file_options"

  if [ -z "${completed_options}" ] ;
  then
    if [ -n "${subcommand}" ] ;
    then
      if [[ "${prev}" == -* ]] && [[ " ${!arg_options} " =~ " ${prev} " ]];
      then
        if [[ " ${!arg_file_options} " =~ " ${prev} " ]];
        then
          COMPREPLY=( $(compgen -f -- ${cur}) )
        else
          COMPREPLY=( $(compgen -W "$(__termius_complete_option_value $subcommand $prev)" -- ${cur}) )
        fi
      else
        COMPREPLY=( $(compgen -W "$(__termius_subcommand_instance $subcommand)" -- ${cur}) )
      fi
    else
      COMPREPLY=( $( compgen -W "" -- "$cur" ) )
    fi
  else
    COMPREPLY=( $(compgen -W "${completed_options}" -- ${cur}) )
  fi
  return 0
}
complete -F _termius termius
# vim: ft=sh sw=2 ts=2 et