summaryrefslogtreecommitdiffstats
path: root/src/cmd.sh
blob: f52e48fa87c08f315a34a265b13c8f34ea34875d (plain)
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
#!/usr/bin/env bash

cmd::escape() {
   tr '\\' "$ESCAPE_CHAR_4"
}

cmd::unescape() {
   tr "$ESCAPE_CHAR_4" '\\'
}

cmd::loop() {
   local -r cmd="$1"
   local -r cheat="$2"

   local arg escaped_arg value escaped_cmd

   arg="$(echo "$cmd" | arg::next)"
   if [ -z "$arg" ]; then
      dict::new cmd "$cmd"
      return
   fi

   escaped_arg="$(arg::escape "$arg")"

   escaped_cmd="$(echo "$cmd" | sed "s|<${arg}>|<${escaped_arg}>|g")"
   arg="$escaped_arg"

   local -r values="$(dict::get "$OPTIONS" values)"
   value="$(echo "$values" | coll::get $i)"
   [ -z "$value" ] && value="$(arg::pick "$arg" "$cheat")"

   dict::new \
      cmd "${escaped_cmd:-}" \
      value "$value" \
      arg "$arg"
}

cmd::finish() {
   local -r cmd="$(echo "$1" | cmd::unescape)"
   local -r selection="${2:-}"

   local -r key="$(selection::key "$selection")"
   local -r unresolved_arg="$(echo "$cmd" | arg::next)"

   local -r print="$(dict::get "$OPTIONS" print)"
   if [[ "$key" = "ctrl-y" ]]; then
      clip::set "$cmd"
   elif $print || [ -n "$unresolved_arg" ]; then
      echo "$cmd" | ui::remove_dep_order
   else
      eval "$cmd"
   fi
}