Skip to content

Instantly share code, notes, and snippets.

@reggi
Last active January 22, 2023 21:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save reggi/92bcfcf5adc44b2b6c14058e7113d7f6 to your computer and use it in GitHub Desktop.
Save reggi/92bcfcf5adc44b2b6c14058e7113d7f6 to your computer and use it in GitHub Desktop.
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