-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtaskleef-completion.bash
More file actions
125 lines (115 loc) · 4.53 KB
/
taskleef-completion.bash
File metadata and controls
125 lines (115 loc) · 4.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#!/bin/bash
# Bash completion for todo CLI
# Source this file or add to .bashrc:
# source /path/to/todo-completion.bash
_todo_get_projects() {
local api_url="${TODO_API_URL:-https://todo.extroverteddeveloper.com}"
local api_key="${TODO_API_KEY}"
if [[ -z "$api_key" ]]; then
return
fi
curl -s -H "X-API-Key: $api_key" "${api_url}/projects" 2>/dev/null | \
jq -r '.[].title // empty' 2>/dev/null
}
_todo_get_todos() {
local api_url="${TODO_API_URL:-https://todo.extroverteddeveloper.com}"
local api_key="${TODO_API_KEY}"
if [[ -z "$api_key" ]]; then
return
fi
curl -s -H "X-API-Key: $api_key" "${api_url}/todos" 2>/dev/null | \
jq -r '.[] | select(.isCompleted == false) | .title // empty' 2>/dev/null
}
_todo_completions() {
local cur prev words cword
_init_completion || return
local commands="add list ls inbox show subtask complete done delete rm project help"
local project_commands="list ls add show delete rm add-todo remove-todo"
case "${words[1]}" in
project)
case "${words[2]}" in
add-todo|remove-todo)
if [[ $cword -eq 3 ]]; then
# Complete project names
local projects
projects=$(_todo_get_projects)
if [[ -n "$projects" ]]; then
local IFS=$'\n'
COMPREPLY=($(compgen -W "$projects" -- "$cur"))
# Handle spaces in names
if [[ ${#COMPREPLY[@]} -eq 1 && "${COMPREPLY[0]}" == *" "* ]]; then
COMPREPLY=("\"${COMPREPLY[0]}\"")
fi
fi
elif [[ $cword -eq 4 ]]; then
# Complete todo titles
local todos
todos=$(_todo_get_todos)
if [[ -n "$todos" ]]; then
local IFS=$'\n'
COMPREPLY=($(compgen -W "$todos" -- "$cur"))
if [[ ${#COMPREPLY[@]} -eq 1 && "${COMPREPLY[0]}" == *" "* ]]; then
COMPREPLY=("\"${COMPREPLY[0]}\"")
fi
fi
fi
;;
show|delete|rm)
if [[ $cword -eq 3 ]]; then
local projects
projects=$(_todo_get_projects)
if [[ -n "$projects" ]]; then
local IFS=$'\n'
COMPREPLY=($(compgen -W "$projects" -- "$cur"))
if [[ ${#COMPREPLY[@]} -eq 1 && "${COMPREPLY[0]}" == *" "* ]]; then
COMPREPLY=("\"${COMPREPLY[0]}\"")
fi
fi
fi
;;
""|list|ls|add)
if [[ $cword -eq 2 ]]; then
COMPREPLY=($(compgen -W "$project_commands" -- "$cur"))
fi
;;
*)
if [[ $cword -eq 2 ]]; then
COMPREPLY=($(compgen -W "$project_commands" -- "$cur"))
fi
;;
esac
;;
show|complete|done|delete|rm)
if [[ $cword -eq 2 ]]; then
local todos
todos=$(_todo_get_todos)
if [[ -n "$todos" ]]; then
local IFS=$'\n'
COMPREPLY=($(compgen -W "$todos" -- "$cur"))
if [[ ${#COMPREPLY[@]} -eq 1 && "${COMPREPLY[0]}" == *" "* ]]; then
COMPREPLY=("\"${COMPREPLY[0]}\"")
fi
fi
fi
;;
subtask)
if [[ $cword -eq 2 ]]; then
local todos
todos=$(_todo_get_todos)
if [[ -n "$todos" ]]; then
local IFS=$'\n'
COMPREPLY=($(compgen -W "$todos" -- "$cur"))
if [[ ${#COMPREPLY[@]} -eq 1 && "${COMPREPLY[0]}" == *" "* ]]; then
COMPREPLY=("\"${COMPREPLY[0]}\"")
fi
fi
fi
;;
*)
if [[ $cword -eq 1 ]]; then
COMPREPLY=($(compgen -W "$commands" -- "$cur"))
fi
;;
esac
}
complete -F _todo_completions todo