# Author:       Li Junhao           l@x-cmd.com
# shellcheck    shell=sh            disable=SC3043,SC2164     # xrc

# license:      GPLv3


# V="abc" x assert =case 'a' 'b' 'c'
# x cama "Vail"
# x rema "vail" "" "" ""
# x is within

# V=abc x assert incase "a" "b" "c"

# I don't want to invent a new concept but 'x case' already taken... I might use case one day.

___x_cmd_cama_code_(){
    local IFS='|'
    ___X_CMD_CAMA_CODE_="case \"\$${VARNAME:-e}\" in $*) true ;; *) false ;; esac;"
}

___x_cmd_cama_fun___code_(){
    local funcname="${1:?Provide function name}"; shift
    local ___X_CMD_CAMA_CODE_=
    VARNAME=1 ___x_cmd_cama_code_ "$@"

    ___X_CMD_CAMA_FUN___CODE_="${funcname}(){ $___X_CMD_CAMA_CODE_ }"
}

___x_cmd_cama_fun(){
    local ___X_CMD_CAMA_FUN___CODE_; ___X_CMD_CAMA_FUN___CODE_ "$@"
    eval "$___X_CMD_CAMA_FUN___CODE_"
}

___x_cmd_cama(){
    local e="$1"; shift
    local ___X_CMD_CAMA_CODE_;   VARNAME=e ___x_cmd_cama_code_ "$@"
    eval "$___X_CMD_CAMA_CODE_"
}

# V="$val" assert =case 'a*.*' 'b*'
# case "$val" in a*.*|b*) ;; *) assert false ;;  esac

# ___x_cmd_cama_run ab.c 'a*.*' 'b*'
# case "$val" in a*.*|b*) true ;;   *) false;  esac

# x case a=3 b=c d=5

# x cama "value" ""

# V="$val" assert case "a*.*" 'b*'
# V="$val" assert case 'a*.*' 'b*'


xrc setmain ___x_cmd_cama
