Commit 2735a65c authored by Dom Sekotill's avatar Dom Sekotill
Browse files

Added argument parsing functions

parent c656d78d
Loading
Loading
Loading
Loading
+117 −1
Original line number Diff line number Diff line
@@ -32,6 +32,122 @@ usage ()
	USAGE
}

die ()
{
	printf -- "$@"
	echo
	exit 1
} >&2

add_arg ()
{
	local argtype=$1 argname=$2 dest=$3 default=$4 metavar=$5
	if [ "$argtype" = FLAG ]; then
		default=no
	elif [ "$argtype" = VALUE ]; then
		echo -n
	else
		die "'argtype' must be one of 'FLAG' or 'VALUE'"
	fi
	dest=${dest:-$argname}
	dest=${dest##-}
	dest=${dest##-}
	dest=${dest//-/_}
	metavar=${metavar:-`echo $dest | tr [a-z] [A-Z]`}
	eval _ARGS_${argtype}_${dest}=\"$dest,$metavar,$argtype,$default$'\n'$argname\"
}

add_arg_alias ()
{
	local dest=$1 alias=$2 var flag_var value_var
	dest=${dest##-}
	dest=${dest##-}
	dest=${dest//-/_}
	flag_var=_ARGS_FLAG_$dest
	value_var=_ARGS_VALUE_$dest
	if [ "${!flag_var}" ]; then
		var="$flag_var"
	elif [ "${!value_var}" ]; then
		var="$value_var"
	else
		die "$dest is not a valid argument or destination"
	fi
	eval "$var=\"\$$var,$alias\""
}

add_option ()
{
	local dest=$1 default=$2 required=$3 metavar=$4
	required=${required:-yes}
	[ "$required" = yes ] || [ "$required" = no ] || \
		die "'required' must be one of 'yes' or 'no'"
	metavar=${metavar:-$dest}
	eval _OPTS_$dest=$dest,$metavar,$required,\"$default\"
}

sumarise_args ()
{
	local ignore_long_flag short_flags long_flags values
	local arg dest metavar argtype default names required
	local yes=" <%s>" no=" [<%s>]"
	local IFS
	for arg in ${!_ARGS_*}; do
		{
			IFS=,
			read dest metavar argtype default
			read -a names
		} <<< "${!arg}"
		if [ "$argtype" = FLAG ]; then
			ignore_long_flag=no
			for name in ${names[@]}; do
				case $name in
					-?)
						short_flags="${short_flags:--}${name#-}"
						ignore_long_flag=yes
						break ;;
				esac
			done
			if [ "$ignore_long_flag" = no ]; then
				long_flags="$long_flags [${names[0]}]"
			fi
		else
			values="$values [${names[0]} <$metavar>]"
		fi
	done
	printf -- "${short_flags:+ [$short_flags]}$long_flags$values"
	for arg in ${!_OPTS_*}; do
		IFS=, read dest metavar required default <<< "${!arg}"
		printf "${!required}" $metavar
	done
	echo
}

parse_args ()
{
	local command=$1
	shift
	while [ "$1" ]; do
		case "$1" in
			--help|-h)
				printf "$BIN $command"
				sumarise_args
				return 1
				;;
			--summary)
				echo "$summary"
				return 1
				;;
		esac
		shift
	done
}

free_args ()
{
	for arg in ${!_ARGS_*} ${!_OPTS_*}; do
		eval unset $arg
	done
}

cmd_init ()
{
@@ -54,7 +170,7 @@ cmd_help ()
	exit 0
}

cmd_$1 "${@:2}"
cmd_$1 "$@"

if [ $? -eq 127 ]; then
	usage