{ foldlAttrs, writeShellScriptBin, works, }: let statusFns = foldlAttrs ( acc: name: works: acc + '' function status-${name}() { ${works.status}/bin/status } '' ) "" works; statusAll = '' function status-all() { '' + foldlAttrs ( acc: name: works: acc + "${works.status}/bin/status\n" ) "" works + ''}''; startAll = '' function start-all() { '' + foldlAttrs ( acc: name: works: acc + "${works.runner}/bin/run\n" ) "" works + ''}''; startFns = foldlAttrs ( acc: name: works: acc + '' function start-${name}() { ${works.runner}/bin/run } '' ) "" works; stopAll = '' function stop-all() { '' + foldlAttrs ( acc: name: works: acc + "${works.cleaner}/bin/clean\n" ) "" works + '' } ''; stopFns = foldlAttrs ( acc: name: works: acc + '' function stop-${name}() { ${works.cleaner}/bin/clean } '' ) "" works; restartFns = foldlAttrs ( acc: name: _: acc + '' function restart-${name} { stop-${name} start-${name} } '' ) "" works; names = foldlAttrs ( acc: name: _: acc ++ [ name ] ) [ ] works; mkCmd = desc: fn: synonyms: { inherit desc fn synonyms; }; actions = [ (mkCmd "start service" "start" [ "run" "r" "up" ]) (mkCmd "stop service" "stop" [ "s" "clean" "et-tu" "down" ]) (mkCmd "restart a service" "restart" [ "qq" "re" ]) (mkCmd "show service status" "status" [ "stat" "check" "ch" ]) ]; actionHelp = builtins.concatStringsSep "\n" ( map (cmd: '' \t${cmd.fn}\t\tsynonyms: ${builtins.concatStringsSep " " cmd.synonyms} \t- ${cmd.desc} '') actions ); help = '' [ides]: use "ides [action] [target]" to control services. actions: ${actionHelp} \ttargets synonyms: t \t- print a list of available targets \thelp \t- print this helpful information target names are the same as the attribute name used to define a service. eg. value of service.*.name, or serviceDefs.{name} an empty target will execute the action on all available services. ''; in writeShellScriptBin "ides" '' targets=(${builtins.concatStringsSep " " names}) function print-help() { printf '${help}' } function list-targets() { echo ''${targets[@]} } function check-target() { found=1 for target in "''${targets[@]}"; do if [ "$1" == "$target" ]; then found=0 break fi done printf $found } ${statusFns} ${statusAll} ${startFns} ${startAll} ${stopFns} ${stopAll} ${restartFns} function restart-all() { stop-all start-all } function action() { action=$1 if [[ $# -gt 1 ]]; then shift for service in "$@"; do if [[ $(check-target $service) -eq 0 ]]; then $action-$service else echo "[ides]: no such target: $service" fi done else $action-all fi } case $1 in ${builtins.concatStringsSep "\n" ( map (action: '' ${action.fn}|${builtins.concatStringsSep "|" action.synonyms}) shift action ${action.fn} $@ ;; '') actions )} targets|t) list-targets ;; -h|h|help|*) print-help ;; esac ''