#!/usr/bin/env bash # This script defines common commands used during building / developing # and makes it easy to run them. THIS=$0 COMMAND=${1:-watch} shift ARGS="$@" BOLD="\e[1m" UNDERLINED="\e[4m" RESET="\e[0m" LIGHT_CYAN="\e[96m" DEFAULT_COLOR="\e[39m" BUILD_CMD="stack build" WATCH_CMD="$BUILD_CMD --file-watch" TEST_CMD="$BUILD_CMD --test" TEST_WATCH_CMD="$TEST_CMD --file-watch" EXEC_CMD="stack exec wasp $ARGS" GHCID_CMD="ghcid --command=stack ghci" echo_and_eval () { echo -e $"${LIGHT_CYAN}Running:${DEFAULT_COLOR}" $1 "\n" $1 } echo_bold () { echo -e $"${BOLD}${1}${RESET}"; } print_usage () { print_usage_cmd () { echo -e $" ${UNDERLINED}${1}${RESET}" echo " $2"; } echo_bold "Usage: ${THIS} " echo "Commands:" print_usage_cmd "build" \ "Builds the project." print_usage_cmd "watch" \ "Builds the project on any file change. (DEFAULT)" print_usage_cmd "test" \ "Builds the project and executes tests." print_usage_cmd "test-watch" \ "Builds the project and executes tests on any file change." print_usage_cmd "exec" \ "Builds the project once and runs the executable while forwarding arguments." print_usage_cmd "ghcid" \ "Runs ghcid, which is much faster alternative to 'watch'." print_usage_cmd "ghcid-test" \ "Runs ghcid on tests, which is much faster alternative to 'test-watch'." } case $COMMAND in build) echo_and_eval "$BUILD_CMD" ;; watch) echo_and_eval "$WATCH_CMD" ;; ghcid) echo_and_eval "$GHCID_CMD" ;; ghcid-test) # --color always is needed for Tasty to turn on the coloring. # NOTE: I did not put this into variable because I was not able to put single quotes # around :main --color always that way and it was not working. ghcid -T=':main --color always' --command=stack ghci test/TastyDiscoverDriver.hs ;; test) echo_and_eval "$TEST_CMD" ;; test-watch) echo_and_eval "$TEST_WATCH_CMD" ;; exec) echo_and_eval "$BUILD_CMD" echo echo_and_eval "$EXEC_CMD" ;; *) print_usage exit 1 esac