#!/bin/bash

###
# argh.sh
#
# arg helper.  or something.  makes it easy to treat variables in a 
# bash script as option flags.  also sets up usage docs.
#
# Usage:
#
#  1. Run the script and eval its results
#     eval "$(./argh.sh $@)"
#  2. Use variable substitutions to provide defaults (example sets $VAR to 'default')
#     VAR="${VAR:-default}"
#  3. Annotate your variables. hash-dash comments (#-) marks them for argh, provides usage text.
#     PORT="${PORT:8080}"  #- runs demo server on port (default: 8080)
#  4. (Optional) Provide additional notes/text with hash-dash comments with novar
#     #- Description: script.sh runs a demo script
###


# get the parent script
CMD=$(ps -ocommand= -p $PPID | cut -f 2 -d' ')
[[ -x "$CMD" ]] || CMD=$(which $CMD)

# get ARGS from command line, set vars from shell script
ARGS="$(echo $@ | sed -e 's/--/\n/g')"

# RE matches magic argh vars.  Should probably make the RE more specific
function list_opts {
  grep '#-' "$CMD" 
}

# help message.  this gets eval'ed, hence the echo echo
function opts_help {
  echo -e "echo '\n$(basename $CMD) usage:\n'"
  list_opts | while read line ; do
    opt=$(echo $line | cut -f 1 -d= | tr [:upper:] [:lower:])
    def=$(echo $line | sed -e 's/.*#-//')

    if [[ "$(echo $opt | wc -w)" -gt 1 ]] ; then
      echo "echo $def"
    else 
      echo -e "echo '--$opt %%$def'"
    fi
  done
  echo -e "echo '-h %% Display this help message\n'"
  echo exit
}

# Display help
if [[ "$ARGS" == *-h* ]] ; then
  opts_help | column -t -s%%
  exit
fi

# Or return var set commands
for opt in $(list_opts | cut -f1 -d=) ; do
  value=$(echo "$ARGS" | grep -i $opt | sed -e 's/ *$//' -e 's/\w* //') # use value, or arg name if it's a bool
  echo "$opt='$value'"
done