saturnin-menu 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #!/bin/bash
  2. . "$(ffoom path)" || exit 3
  3. ffoo import inigrep
  4. ffoo import pretty
  5. usage() {
  6. mkusage "[-g generator_cmd] [-s selector_cmd] [-c consumer_cmd] [name]"
  7. }
  8. SATURNIN_MENU_MNAME=""
  9. SATURNIN_MENU_GENERATOR=""
  10. SATURNIN_MENU_SELECTOR=""
  11. SATURNIN_MENU_SELECT_ARGS=""
  12. SATURNIN_MENU_CONSUMER=""
  13. load_parts() {
  14. #
  15. # Load mandatory parts for menu name $1
  16. #
  17. local mname
  18. # last chance to get mname
  19. test -n "$SATURNIN_MENU_MNAME" \
  20. || SATURNIN_MENU_MNAME="$(get_mname)" \
  21. || usage
  22. mname="$SATURNIN_MENU_MNAME"
  23. # check that menu item exists
  24. inigrep -s "menu.$mname" | grep -q . \
  25. || die "no such menu: $mname"
  26. test -n "$SATURNIN_MENU_GENERATOR" \
  27. || SATURNIN_MENU_GENERATOR="$(get_generator)" \
  28. || die "cannot find generator for menu: $mname"
  29. test -n "$SATURNIN_MENU_SELECTOR" \
  30. || SATURNIN_MENU_SELECTOR="$(get_selector)" \
  31. || die "cannot find selector for menu: $mname"
  32. test -n "$SATURNIN_MENU_SELECT_ARGS" \
  33. || SATURNIN_MENU_SELECT_ARGS="$(get_select_args)"
  34. test -n "$SATURNIN_MENU_CONSUMER" \
  35. || SATURNIN_MENU_CONSUMER="$(get_consumer)" \
  36. || die "cannot find consumer for menu: $mname"
  37. }
  38. get_mname() {
  39. #
  40. # Take from global INI default
  41. #
  42. inigrep -1 -p menu._default_.name | grep .
  43. }
  44. get_generator() {
  45. #
  46. # Obtain and echo generator for menu $mname
  47. #
  48. # First, look for 'generator' key in menu definition,
  49. # then for items as 'item' keys at the same place,
  50. # finally default 'generator'.
  51. #
  52. inigrep -1 -p "menu.$mname.generator" | grep . \
  53. && return 0
  54. inigrep -p "menu.$mname.item" | grep -m 1 -q . \
  55. && echo "inigrep -p menu.$mname.item" \
  56. && return 0
  57. inigrep -1 -p "menu._default_.generator" | grep . \
  58. && return 0
  59. return 1
  60. }
  61. get_selector() {
  62. #
  63. # Obtain and echo selector for menu $mname
  64. #
  65. # First, look for 'selector' key in menu definition,
  66. # then a default 'selector'.
  67. #
  68. inigrep -1 -p "menu.$mname.selector" | grep . \
  69. && return 0
  70. inigrep -1 -p "menu._default_.selector" | grep .
  71. }
  72. get_select_args() {
  73. #
  74. # Obtain and echo selector args for menu $mname
  75. #
  76. # First, look for 'select_args' key in menu definition,
  77. # then a default 'select_args'.
  78. #
  79. inigrep -1 -p "menu.$mname.select_args" | grep . \
  80. && return 0
  81. inigrep -1 -p "menu._default_.select_args"
  82. }
  83. get_consumer() {
  84. #
  85. # Obtain and echo consumer args for menu $mname
  86. #
  87. # First, look for 'consumer' key in menu definition,
  88. # then a default 'consumer'.
  89. #
  90. inigrep -1 -p "menu.$mname.consumer" | grep . \
  91. && return 0
  92. inigrep -1 -p "menu._default_.consumer" | grep .
  93. }
  94. do_generate() {
  95. #
  96. # Generate menu items
  97. #
  98. bash -n <<<"$SATURNIN_MENU_GENERATOR" \
  99. || die "syntax errors in generator: $SATURNIN_MENU_GENERATOR"
  100. eval "$SATURNIN_MENU_GENERATOR"
  101. }
  102. do_select() {
  103. #
  104. # Bring up selection UI
  105. #
  106. bash -n <<<"$SATURNIN_MENU_SELECTOR" \
  107. || die "syntax errors in selector: $SATURNIN_MENU_SELECTOR"
  108. eval "$SATURNIN_MENU_SELECTOR $SATURNIN_MENU_SELECT_ARGS"
  109. }
  110. do_consume() {
  111. #
  112. # Process the selected item(s)
  113. #
  114. bash -n <<<"$SATURNIN_MENU_CONSUMER" \
  115. || die "syntax errors in consumer: $SATURNIN_MENU_CONSUMER"
  116. eval "$SATURNIN_MENU_CONSUMER"
  117. }
  118. while true; do case "$1" in
  119. -g) SATURNIN_MENU_GENERATOR="$2"; shift; shift ;;
  120. -s) SATURNIN_MENU_SELECTOR="$2"; shift; shift ;;
  121. -c) SATURNIN_MENU_CONSUMER="$2"; shift; shift ;;
  122. -*) usage ;;
  123. "") usage ;;
  124. *) SATURNIN_MENU_MNAME="$1"; shift; break ;;
  125. esac done
  126. load_parts
  127. debug -v SATURNIN_MENU_MNAME \
  128. SATURNIN_MENU_GENERATOR \
  129. SATURNIN_MENU_SELECTOR \
  130. SATURNIN_MENU_SELECT_ARGS \
  131. SATURNIN_MENU_CONSUMER
  132. do_generate | do_select | do_consume