Last active
January 22, 2023 21:53
-
-
Save reggi/92bcfcf5adc44b2b6c14058e7113d7f6 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
SELF="${0}" | |
function green () { | |
START="\033[0;32m" | |
END="\033[0m" | |
echo -e "${START}${1}${END}" | |
} | |
USAGE="" | |
declare -gA USAGE_REGISTRY | |
function register () { | |
ADDITION="" | |
CMDNAME=$1 | |
CMDUSAGE=$2 | |
CMDDESC=$3 | |
COUNT=0 | |
shift && shift && shift | |
SUBNAME="" | |
SUBUSAGE="" | |
SUBDESC="" | |
ADDITION+="$(green $CMDNAME) $CMDUSAGE\\n" | |
if [ -n "$CMDDESC" ]; then | |
ADDITION+=" "$CMDDESC"\\n" | |
fi | |
for var in "$@" | |
do | |
if [ $(( COUNT % 3 )) -eq 0 ]; then | |
SUBNAME=$var | |
fi | |
if [ $(( COUNT % 3 )) -eq 1 ]; then | |
SUBUSAGE=$var | |
fi | |
if [ $(( COUNT % 3 )) -eq 2 ]; then | |
SUBDESC=$var | |
BUSAGE="$(green $SUBNAME) $SUBUSAGE" | |
ADDITION=" $BUSAGE\\n $SUBDESC\\n" | |
fi | |
COUNT=$((COUNT + 1)) | |
done | |
USAGE_REGISTRY[$CMDNAME]=$ADDITION | |
USAGE+=$ADDITION | |
} | |
register "register" "<CMD> <ARGS> <DESC> ...[<SUBCMD> <SUBARGS> <SUBDESC>]" "registers a command" | |
function edit () { | |
if [ "$1" = "file" ]; then | |
code $SELF | |
else | |
code $(dirname $SELF) | |
fi | |
} | |
register "edit" "[file]" "opens scripts dir in vscode" | |
function reload () { | |
source ~/workspace/scripts/main.sh | |
} | |
register "reload" "" "reloads scripts" | |
function usage () { | |
if (help usage $@) return; | |
echo $USAGE | |
} | |
register "usage" "" "shows scripts usage" | |
function flag () { | |
OPTIONS=() | |
ARGS=() | |
PAST=0 | |
for ARG in "$@"; do | |
if [ "$ARG" = "--" ]; then | |
PAST=1 | |
elif [ "$PAST" -eq 1 ]; then | |
ARGS+=("$ARG") | |
if [[ "$ARG" = --* ]]; then | |
ARGS+=("$ARG") | |
elif [[ "$ARG" = -* ]]; then | |
LETTERS=($(echo "$ARG" | grep -o .)) | |
for LETTER in "$LETTERS[@]"; do | |
ARGS+=("-$LETTER") | |
done | |
fi | |
else | |
OPTIONS+=("$ARG") | |
if [[ "$ARG" = --* ]]; then | |
DEDASHED=$(echo "$ARG" | sed 's/-//g') | |
OPTIONS+=("--$DEDASHED") | |
fi | |
fi | |
done | |
FOUND=1 | |
for ARG in "$ARGS[@]"; do | |
for OPTION in "$OPTIONS[@]"; do | |
if [ "$ARG" = "$OPTION" ]; then | |
FOUND=0 | |
fi | |
done | |
done | |
return FOUND | |
} | |
register "flag" "...<MATCHES> -- ...<ARGS>" "checks if flag exists in args" | |
function help () { | |
CMD=$1 | |
shift | |
if (flag --help -help --h -h -- $@); then | |
echo $USAGE_REGISTRY[$CMD]; | |
return 0 | |
fi | |
return 1 | |
} | |
HELP_FLAG="[--help, -h]" | |
register "help" "<CMD> [--help] [-help] [--h] [-h]" "returns true if help flag is set" | |
function force () { | |
return $(flag --force -f -- "$@") | |
} | |
FORCE_FLAG="[--force, -f]" | |
register "force" "$FORCE_FLAG" "returns true if --force flag is set" | |
function verbose () { | |
return $(flag --verbose -v -- "$@") | |
} | |
VERBOSE_FLAG="[--verbose, -v]" | |
register "verbose" "$VERBOSE_FLAG" "returns true if --verbose flag is set" | |
function dry-run () { | |
return $(flag --dry-run -d -- "$@") | |
} | |
DRY_FLAG="[--dry-run, -d]" | |
register "dry-run" "$DRY_FLAG" "returns true if --dry-run flag is set" | |
function example () { | |
if (help example $@) return; | |
if (force $@); then | |
echo "yep forced" | |
fi | |
if (verbose $@); then | |
echo "yep verbose" | |
fi | |
if (dry-run $@); then | |
echo "yep dry" | |
fi | |
echo "more stuff" | |
} | |
register "example" "<CMD> $DRY_FLAG $FORCE_FLAG $VERBOSE_FLAG $HELP_FLAG" "returns true if help flag is set" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment