summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBatuhan Taskaya <isidentical@gmail.com>2022-05-19 14:56:25 +0300
committerBatuhan Taskaya <isidentical@gmail.com>2022-05-19 14:56:25 +0300
commit0dce332b16bffe0cc18beb63c8e2cc75d571a490 (patch)
tree5854b02b00516c61e8a3298a58d9660e64522b5f
parent5af4acc798b4f47c2a14bb5d901da67f9f1aa9fd (diff)
more refinements
-rw-r--r--extras/completion/completion.zsh131
-rwxr-xr-xextras/completion/templates/completion.zsh.j2113
-rw-r--r--extras/scripts/completion/zsh.py13
3 files changed, 125 insertions, 132 deletions
diff --git a/extras/completion/completion.zsh b/extras/completion/completion.zsh
index 839502c3..6ed6c131 100644
--- a/extras/completion/completion.zsh
+++ b/extras/completion/completion.zsh
@@ -2,64 +2,79 @@
# Copyright (c) 2015 Github zsh-users
# Based on the initial work of http://github.com/zsh-users
-methods=("GET" "POST" "PUT" "DELETE" "HEAD" "OPTIONS" "PATCH" "TRACE" "CONNECT" )
+METHODS=("GET" "POST" "PUT" "DELETE" "HEAD" "OPTIONS" "PATCH" "TRACE" "CONNECT" )
_httpie_params () {
local ret=1 expl
- local first_arg=$words[NORMARG]
- if (( CURRENT == NORMARG )) && [[ $words[NORMARG] != *:* ]]; then
- # URL
- _httpie_urls && ret=0
- elif (( CURRENT == NORMARG + 1 )) && [[ ${methods[(ie)$first_arg]} -le ${#methods} ]]; then
- # When the first argument is the method, suggest the URL as well.
- _httpie_urls && ret=0
- elif (( CURRENT > NORMARG )); then
- # regular param, if we already have a url
- # ignore all prefix stuff
- compset -P '(#b)([^:@=]#)'
- local name=$match[1]
+ local current=$words[$CURRENT]
+ if (( CURRENT > NORMARG )); then
+ local predecessor=$words[(( $CURRENT - 1 ))]
+ fi
- if false; then
- false;
- elif compset -P ':'; then
- _message "$name HTTP Headers"
-
- elif compset -P '=='; then
- _message "$name URL Parameters"
-
- elif compset -P '='; then
- _message "$name Data Fields"
-
- elif compset -P ':='; then
- _message "$name Raw JSON Fields"
-
- elif compset -P '@'; then
- _files
-
- else
- typeset -a ops
- ops=(
- "\::Arbitrary HTTP header, e.g X-API-Token:123"
- "==:Querystring parameter to the URL, e.g limit==50"
- "=:Data fields to be serialized as JSON (default) or Form Data (with --form)"
- "\:=:Data field for real JSON types."
- "@:Path field for uploading a file."
- )
- _describe -t httpparams 'parameter types' ops -Q -S ''
- fi
- ret=0
+
+ if (( CURRENT == NORMARG + 0 )); then
+ _httpie_method && ret=0
+ fi
+ if (( CURRENT == NORMARG + 0 )); then
+ _httpie_url && ret=0
+ fi
+ if (( CURRENT == NORMARG + 1 )) && [[ ${METHODS[(ie)$predecessor]} -le ${#METHODS} ]]; then
+ _httpie_url && ret=0
fi
+ if (( CURRENT >= NORMARG + 2 )) && ! [[ $current == -* ]]; then
+ _httpie_request_item && ret=0
+ fi
+ if (( CURRENT >= NORMARG + 1 )) && ! [[ ${METHODS[(ie)$predecessor]} -le ${#METHODS} ]] && ! [[ $current == -* ]]; then
+ _httpie_request_item && ret=0
+ fi
+
+
+ return $ret
- # first arg may be a request method
- (( CURRENT == NORMARG )) &&
- _wanted http_method expl 'Request Method' \
- compadd GET POST PUT DELETE HEAD OPTIONS PATCH TRACE CONNECT && ret=0
+}
- return $ret
+_httpie_request_item() {
+ compset -P '(#b)([^:@=]#)'
+ local name=$match[1]
+
+ if false; then
+ false;
+ elif compset -P ':'; then
+ _message "$name HTTP Headers"
+
+ elif compset -P '=='; then
+ _message "$name URL Parameters"
+
+ elif compset -P '='; then
+ _message "$name Data Fields"
+
+ elif compset -P ':='; then
+ _message "$name Raw JSON Fields"
+
+ elif compset -P '@'; then
+ _files
+
+ else
+ typeset -a ops
+ ops=(
+ "\::Arbitrary HTTP header, e.g X-API-Token:123"
+ "==:Querystring parameter to the URL, e.g limit==50"
+ "=:Data fields to be serialized as JSON (default) or Form Data (with --form)"
+ "\:=:Data field for real JSON types."
+ "@:Path field for uploading a file."
+ )
+ _describe -t httpparams 'parameter types' ops -Q -S ''
+ fi
+ return 1;
+}
+_httpie_method() {
+ _wanted http_method expl 'Request Method' \
+ compadd GET POST PUT DELETE HEAD OPTIONS PATCH TRACE CONNECT && ret=0
+ return 1;
}
-_httpie_urls() {
+_httpie_url() {
local ret=1
if ! [[ -prefix [-+.a-z0-9]#:// ]]; then
@@ -73,26 +88,6 @@ _httpie_urls() {
return $ret
}
-_httpie_printflags () {
- local ret=1
-
- # not sure why this is necessary, but it will complete "-pH" style without it
- [[ $IPREFIX == "-p" ]] && IPREFIX+=" "
-
- compset -P '(#b)([a-zA-Z]#)'
-
- local -a flags
- [[ $match[1] != *H* ]] && flags+=( "H:request headers" )
- [[ $match[1] != *B* ]] && flags+=( "B:request body" )
- [[ $match[1] != *h* ]] && flags+=( "h:response headers" )
- [[ $match[1] != *b* ]] && flags+=( "b:response body" )
- [[ $match[1] != *m* ]] && flags+=( "b:response meta" )
-
- _describe -t printflags "print flags" flags -S '' && ret=0
-
- return $ret
-}
-
integer NORMARG
_arguments -n -C -s \
diff --git a/extras/completion/templates/completion.zsh.j2 b/extras/completion/templates/completion.zsh.j2
index 3dd53a45..bd77351d 100755
--- a/extras/completion/templates/completion.zsh.j2
+++ b/extras/completion/templates/completion.zsh.j2
@@ -2,55 +2,70 @@
# Copyright (c) 2015 Github zsh-users
# Based on the initial work of http://github.com/zsh-users
-methods=({% for method in methods -%} "{{ method }}" {% endfor -%})
+METHODS=({% for method in methods -%} "{{ method }}" {% endfor -%})
_httpie_params () {
local ret=1 expl
- local first_arg=$words[NORMARG]
- if (( CURRENT == NORMARG )) && [[ $words[NORMARG] != *:* ]]; then
- # URL
- _httpie_urls && ret=0
- elif (( CURRENT == NORMARG + 1 )) && [[ ${methods[(ie)$first_arg]} -le ${{ '{#' }}methods} ]]; then
- # When the first argument is the method, suggest the URL as well.
- _httpie_urls && ret=0
- elif (( CURRENT > NORMARG )); then
- # regular param, if we already have a url
- # ignore all prefix stuff
- compset -P '(#b)([^:@=]#)'
- local name=$match[1]
-
- if false; then
- false;
- {% for option_name, _, operator, desc in request_items.nested_options -%}
- elif compset -P '{{ operator }}'; then
- {% if is_file_based_operator(operator) -%}
- _files
- {% else -%}
- _message "$name {{ option_name }}"
- {% endif %}
- {% endfor -%}
- else
- typeset -a ops
- ops=(
- {% for option_name, _, operator, desc in request_items.nested_options -%}
- "{{ escape_zsh(operator) }}:{{ desc }}"
- {% endfor -%}
- )
- _describe -t httpparams 'parameter types' ops -Q -S ''
- fi
- ret=0
+ local current=$words[$CURRENT]
+ if (( CURRENT > NORMARG )); then
+ local predecessor=$words[(( $CURRENT - 1 ))]
fi
- # first arg may be a request method
- (( CURRENT == NORMARG )) &&
- _wanted http_method expl 'Request Method' \
- compadd {% for method in methods -%} {{ method }} {% endfor -%} && ret=0
+ {% raw %}
+ if (( CURRENT == NORMARG + 0 )); then
+ _httpie_method && ret=0
+ fi
+ if (( CURRENT == NORMARG + 0 )); then
+ _httpie_url && ret=0
+ fi
+ if (( CURRENT == NORMARG + 1 )) && [[ ${METHODS[(ie)$predecessor]} -le ${#METHODS} ]]; then
+ _httpie_url && ret=0
+ fi
+ if (( CURRENT >= NORMARG + 2 )) && ! [[ $current == -* ]]; then
+ _httpie_request_item && ret=0
+ fi
+ if (( CURRENT >= NORMARG + 1 )) && ! [[ ${METHODS[(ie)$predecessor]} -le ${#METHODS} ]] && ! [[ $current == -* ]]; then
+ _httpie_request_item && ret=0
+ fi
+ {% endraw %}
return $ret
}
-_httpie_urls() {
+_httpie_request_item() {
+ compset -P '(#b)([^:@=]#)'
+ local name=$match[1]
+
+ if false; then
+ false;
+ {% for option_name, _, operator, desc in request_items.nested_options -%}
+ elif compset -P '{{ operator }}'; then
+ {% if is_file_based_operator(operator) -%}
+ _files
+ {% else -%}
+ _message "$name {{ option_name }}"
+ {% endif %}
+ {% endfor -%}
+ else
+ typeset -a ops
+ ops=(
+ {% for option_name, _, operator, desc in request_items.nested_options -%}
+ "{{ escape_zsh(operator) }}:{{ desc }}"
+ {% endfor -%}
+ )
+ _describe -t httpparams 'parameter types' ops -Q -S ''
+ fi
+ return 1;
+}
+
+_httpie_method() {
+ _wanted http_method expl 'Request Method' \
+ compadd {% for method in methods -%} {{ method }} {% endfor -%} && ret=0
+ return 1;
+}
+
+_httpie_url() {
local ret=1
if ! [[ -prefix [-+.a-z0-9]#:// ]]; then
@@ -64,26 +79,6 @@ _httpie_urls() {
return $ret
}
-_httpie_printflags () {
- local ret=1
-
- # not sure why this is necessary, but it will complete "-pH" style without it
- [[ $IPREFIX == "-p" ]] && IPREFIX+=" "
-
- compset -P '(#b)([a-zA-Z]#)'
-
- local -a flags
- [[ $match[1] != *H* ]] && flags+=( "H:request headers" )
- [[ $match[1] != *B* ]] && flags+=( "B:request body" )
- [[ $match[1] != *h* ]] && flags+=( "h:response headers" )
- [[ $match[1] != *b* ]] && flags+=( "b:response body" )
- [[ $match[1] != *m* ]] && flags+=( "b:response meta" )
-
- _describe -t printflags "print flags" flags -S '' && ret=0
-
- return $ret
-}
-
integer NORMARG
_arguments -n -C -s \
diff --git a/extras/scripts/completion/zsh.py b/extras/scripts/completion/zsh.py
index 62f8a10d..97fef5d0 100644
--- a/extras/scripts/completion/zsh.py
+++ b/extras/scripts/completion/zsh.py
@@ -35,9 +35,9 @@ def compile_zsh(node: Node) -> ...:
@compile_zsh.register(If)
def compile_if(node: If) -> str:
- check = compile(node.check)
- action = compile(node.action)
- return f'if {check}; then\n {action};\nfi'
+ check = compile_zsh(node.check)
+ action = compile_zsh(node.action)
+ return f'if {check}; then\n {action} && ret=0\nfi'
@compile_zsh.register(Check)
@@ -71,14 +71,17 @@ def compile_check(node: Check) -> str:
@compile_zsh.register(And)
def compile_and(node: And) -> str:
- return ' && '.join(compile(check) for check in node.checks)
+ return ' && '.join(compile_zsh(check) for check in node.checks)
@compile_zsh.register(Not)
def compile_not(node: Not) -> str:
- return f'! {compile(node.check)}'
+ return f'! {compile_zsh(node.check)}'
@compile_zsh.register(Suggest)
def compile_suggest(node: Suggest) -> str:
return SUGGESTION_TO_FUNCTION[node.suggestion]
+
+for item in main_flow():
+ print(compile_zsh(item))