From bbbd73fc5642ab7ef07385501afb05456b35baa6 Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Tue, 3 Aug 2021 22:38:03 -0500 Subject: [PATCH] basic parser --- install.sh | 173 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 151 insertions(+), 22 deletions(-) diff --git a/install.sh b/install.sh index 3ad1c00..2b34089 100755 --- a/install.sh +++ b/install.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash RED='\033[0;31m' GREEN='\033[0;32m' @@ -35,11 +35,10 @@ _usage() { -r | --remove => Remove the config. -u | --update => Update the existing config without removing existing stuff. " - exit 0 } _eval_exit() { - status=$1 + status=$1 suc_msg=$2 err_msg=$3 @@ -54,43 +53,173 @@ _eval_exit() { } -# _install() {} +_check_dependencies() { + _error_dependencies() { + prompt -r "Error: Install ${1} before proceeding." + exit 1 + } + command -v git 1>/dev/null || _error_dependencies git + return 0 +} + +_install() { + _check_dependencies +} + _remove() { - prompt -i "-> Cleaning '$HOME/.config/nvim/'" + prompt -i "-> Cleaning config ($HOME/.config/nvim/)" # rm -rf "$HOME/.config/nvim/" - prompt -i "-> Cleaning '$HOME/.local/share/nvim/'" - # rm -rf "$HOME./local/share/nvim/" + prompt -i "-> Cleaning miscellaneous ($HOME/.local/share/nvim/)" + # rm -rf "$HOME/.local/share/nvim/" + + prompt -i "-> Cleaning cache ($HOME/.cache/nvim/)" + # rm -rf "$HOME/.cache/nvim/" } # _update() {} -main() { - while :; do - case $1 in - -h | -\? | --help) - _usage - exit 0 +_init_settings() { + no_backup="false" + install="false" + uninstall="false" +} + +_clean_arg() { + arg=$1 + if [[ "$arg" == "--"* ]]; then + echo "${arg:2}" + elif [[ "$arg" == "-"* ]]; then + echo "${arg:1}" + fi +} + + +_parse_args() { + local args_func=$1 + local argv=("$@") + local argc=${#argv[@]} + local skip=0 + + _skip_ahead() { + amount=$1 + skip=$((skip + amount)) + } + + _clean_arg() { + arg=$1 + if [[ "$arg" == "--"* ]]; then + echo "${arg:2}" + elif [[ "$arg" == "-"* ]]; then + echo "${arg:1}" + fi + } + + for j in "${!argv[@]}"; do + if [[ ${skip} -gt 0 ]]; then + left=$((argc - j)) + while [[ ${skip} > ${left} ]]; do ((skip--)); done + skip=$((skip - 1)) + continue + fi + + case ${argv[j]} in + --*) # End of all options. + case ${argv[j]} in + --) # End of all options. + break + ;; + *) + eval "${eval_args}" "$(_clean_arg "${argv[j]}")" "$j" + ;; + esac ;; - -i | --install) - _install + -*) + tangled_args=$(_clean_arg "${argv[j]}") + for ((k = 0; k < ${#tangled_args}; k++)); do + eval "${eval_args}" "${tangled_args:$k:1}" "$j" + done ;; - -r | --remove) - _remove - _eval_exit $? "Successfully removeed NvChad!" "Failed to remove NvChad" - ;; - *) # Default case: No more options, so break out of the loop. - break + *) + prompt -w "Warning: flag ''${argv[j]}' not recognized" ;; esac - shift done +} +main() { + local argv=("$@") + local argc=${#argv[@]} + local skip=0 + + assert_arg() { + var=$1 + index=$2 + case ${var} in + h | help) + _usage + ;; + i | install) + prompt -i "installing..." + ;; + r | remove) + prompt -i "removing..." + ;; + # p | --path + *) + prompt -w "Warning: flag '${var}' not recognized" + ;; + esac + } + + _skip_ahead() { + amount=$1 + skip=$((skip + amount)) + } + + # works for: + # 1. normal flags (e.g. -h,--help) + # 2. nested flags (e.g. -ivh) + # 3. space sperated flags and args (e.g. --option argument) + # 4. equal separated flags and args (e.g. --option=argument) + + + for j in "${!argv[@]}"; do + if [[ ${skip} -gt 0 ]]; then + left=$((argc - j)) + while [[ ${skip} > ${left} ]]; do ((skip--)); done + skip=$((skip - 1)) + continue + fi + + case ${argv[j]} in + --*) # End of all options. + case ${argv[j]} in + --) # End of all options. + break + ;; + *) + assert_arg "$(_clean_arg "${argv[j]}")" "$j" + ;; + esac + ;; + -*) + tangled_args=$(_clean_arg "${argv[j]}") + for ((k = 0; k < ${#tangled_args}; k++)); do + assert_arg "${tangled_args:$k:1}" "$j" + done + ;; + *) + prompt -w "Warning: flag ''${argv[j]}' not recognized" + ;; + esac + done } init() { if [ $# -eq 0 ]; then prompt -e "ERROR: This script needs at least one argument" else + _init_settings main "${@}" fi }