#!/bin/bash . "$(ffoom path)" ffoo import inigrep ffoo import pretty usage() { mkusage "[-g generator_cmd] [-s selector_cmd] [-c consumer_cmd] [name]" } SATURNIN_MENU_MNAME="" SATURNIN_MENU_GENERATOR="" SATURNIN_MENU_SELECTOR="" SATURNIN_MENU_SELECT_ARGS="" SATURNIN_MENU_CONSUMER="" load_parts() { # # Load mandatory parts for menu name $1 # local mname # last chance to get mname test -n "$SATURNIN_MENU_MNAME" \ || SATURNIN_MENU_MNAME="$(get_mname)" \ || usage mname="$SATURNIN_MENU_MNAME" # check that menu item exists inigrep -s "menu.$mname" | grep -q . \ || die "no such menu: $mname" test -n "$SATURNIN_MENU_GENERATOR" \ || SATURNIN_MENU_GENERATOR="$(get_generator)" \ || die "cannot find generator for menu: $mname" test -n "$SATURNIN_MENU_SELECTOR" \ || SATURNIN_MENU_SELECTOR="$(get_selector)" \ || die "cannot find selector for menu: $mname" test -n "$SATURNIN_MENU_SELECT_ARGS" \ || SATURNIN_MENU_SELECT_ARGS="$(get_select_args)" test -n "$SATURNIN_MENU_CONSUMER" \ || SATURNIN_MENU_CONSUMER="$(get_consumer)" \ || die "cannot find consumer for menu: $mname" } get_mname() { # # Take from global INI default # inigrep -1 -p menu._default_.name | grep . } get_generator() { # # Obtain and echo generator for menu $mname # # First, look for 'generator' key in menu definition, # then for items as 'item' keys at the same place, # finally default 'generator'. # inigrep -1 -p "menu.$mname.generator" | grep . \ && return 0 inigrep -p "menu.$mname.item" | grep -m 1 -q . \ && echo "inigrep -p menu.$mname.item" \ && return 0 inigrep -1 -p "menu._default_.generator" | grep . \ && return 0 return 1 } get_selector() { # # Obtain and echo selector for menu $mname # # First, look for 'selector' key in menu definition, # then a default 'selector'. # inigrep -1 -p "menu.$mname.selector" | grep . \ && return 0 inigrep -1 -p "menu._default_.selector" | grep . } get_select_args() { # # Obtain and echo selector args for menu $mname # # First, look for 'select_args' key in menu definition, # then a default 'select_args'. # inigrep -1 -p "menu.$mname.select_args" | grep . \ && return 0 inigrep -1 -p "menu._default_.select_args" } get_consumer() { # # Obtain and echo consumer args for menu $mname # # First, look for 'consumer' key in menu definition, # then a default 'consumer'. # inigrep -1 -p "menu.$mname.consumer" | grep . \ && return 0 inigrep -1 -p "menu._default_.consumer" | grep . } do_generate() { # # Generate menu items # bash -n <<<"$SATURNIN_MENU_GENERATOR" \ || die "syntax errors in generator: $SATURNIN_MENU_GENERATOR" eval "$SATURNIN_MENU_GENERATOR" } do_select() { # # Bring up selection UI # bash -n <<<"$SATURNIN_MENU_SELECTOR" \ || die "syntax errors in selector: $SATURNIN_MENU_SELECTOR" eval "$SATURNIN_MENU_SELECTOR $SATURNIN_MENU_SELECT_ARGS" } do_consume() { # # Process the selected item(s) # bash -n <<<"$SATURNIN_MENU_CONSUMER" \ || die "syntax errors in consumer: $SATURNIN_MENU_CONSUMER" eval "$SATURNIN_MENU_CONSUMER" } while true; do case "$1" in -g) SATURNIN_MENU_GENERATOR="$2"; shift; shift ;; -s) SATURNIN_MENU_SELECTOR="$2"; shift; shift ;; -c) SATURNIN_MENU_CONSUMER="$2"; shift; shift ;; -*) usage ;; "") usage ;; *) SATURNIN_MENU_MNAME="$1"; shift; break ;; esac done load_parts debug -v SATURNIN_MENU_MNAME \ SATURNIN_MENU_GENERATOR \ SATURNIN_MENU_SELECTOR \ SATURNIN_MENU_SELECT_ARGS \ SATURNIN_MENU_CONSUMER do_generate | do_select | do_consume