#!/bin/bash # planr-cfg # --------- # # This is major WIP # Intended to make configuring planr much easier set -e -o pipefail PROGRAM="${0##*/}" PLANR_DIR=planr SRC_DIR=src PROJECT_CONFIG_FILE="config.toml" die () { if [[ $# -eq 0 ]]; then echo -n "$PROGRAM: " 1>&2 cat <&0 1>&2 elif [[ $# -eq 1 ]]; then echo "$PROGRAM: $1" 1>&2 fi exit 1 } err () { printf "$1" 1>&2 } create_project_config() { cat > "$1" <<_EOF version="$(planr version)" _EOF } make_directory_structure() { shift mkdir "$1" cd "$1" mkdir "${PLANR_DIR}" mkdir "${PLANR_DIR}/rubric" mkdir "${PLANR_DIR}/tests" mkdir "${SRC_DIR}" local project_config project_config="${PLANR_DIR}/${PROJECT_CONFIG_FILE}" create_project_config "${project_config}" } config_dir() { echo "$(planr config configdir)" } src_dir() { echo "$(planr config srcdir)" } rubric_dir() { echo "$(config_dir)/rubric" } test_dir() { echo "$(config_dir)/tests" } uppercase_str() { printf '%s\n' "$1" | awk '{ print toupper($0) }' } create_with_subdirs() { local dir dir="$(dirname $1)" mkdir -p "$dir" } cpp_unitdef() { local testfile local name testfile="$1" name="$2" cat <<_EOF title="Example Title" description=""" Example description """ [adapters.gtest] name="$name" testfile="$testfile" _EOF } bash_unitdef() { local testfile local name testfile="$1" name="$2" cat <<_EOF title="Example Title" description=""" Example description """ [adapters.bash] name="$name" testfile="$testfile" _EOF } cpp_boilerplate() { local name name="$1" cat <<_EOF #include "gtest/gtest.h" TEST(SUITE, $name) { } _EOF } bash_boilerplate() { cat <<_EOF #!/bin/bash exit 0 _EOF } add_unit() { local fmt local edit fmt="cpp" shift local opt while [[ $# -gt 1 ]]; do case "$1" in --fmt|-f) opt="$1" shift if [[ $# -eq 0 ]]; then die "$opt requires an option" fi fmt="$1" shift ;; --edit|-e) edit=1; shift; ;; *) die "$(print_usage)" ;; esac done local pathspec pathspec="$1" local unitdef local testfile local name local base base="$(basename $pathspec)" name="$(uppercase_str $base)" unitdef="${pathspec}.toml" testfile="$(test_dir)/$base" if [[ "$fmt" = "cpp" ]]; then testfile="${testfile}.cpp" elif [[ "$fmt" = "bash" ]]; then testfile="${testfile}.bash" else die "Format not recognized \"${fmt}\"" fi local unitdef_abs unitdef_abs="$(rubric_dir)/${unitdef}" create_with_subdirs "$unitdef_abs" create_with_subdirs "$testfile" if [[ "$fmt" = "cpp" ]]; then cpp_unitdef "$unitdef" "$name" >"$unitdef_abs" cpp_boilerplate "$name" >"$testfile" elif [[ "$fmt" = "bash" ]]; then bash_unitdef "$unitdef" "$name" >"$unitdef_abs" bash_boilerplate "$name" >"$testfile" fi if [[ -n "$edit" ]]; then [[ -z "$EDITOR" ]] && die "Cannot find editor" "$EDITOR" "$unitdef_abs" "$EDITOR" "$testfile" fi } print_usage() { cat <<_EOF ${PROGRAM} new-project add-unit _EOF } planr-cfg() { if [[ $# -eq 0 ]]; then die "$(print_usage)" fi if [[ "$1" = "new-project" ]]; then make_directory_structure "${@:1}" exit 0 fi if [[ "$1" = "add-unit" ]]; then add_unit "${@:1}" exit 0 fi err "Command not reconized \"$1\"\n" die "$(print_usage)" } planr-cfg "$@"