# shellcheck shell=dash disable=SC2142

___x_cmd_arg___init(){
    ___X_CMD_ARG_LOGGERNAME="${1}"
    ___X_CMD_ARG_HELPCMD="${2}"
}

alias arg:init='
    2>/dev/null 1>&2 local ___X_CMD_ARG_LOGGERNAME;
    2>/dev/null 1>&2 local ___X_CMD_ARG_HELPCMD;
    ___x_cmd_arg___init'

alias arg:ret:64='M="${M}${___X_CMD_ARG_HELPCMD:+"
More info: $___X_CMD_ARG_HELPCMD"}" N="${___X_CMD_ARG_LOGGERNAME:-arg}" log:ret:64'

___x_cmd_arg_initx(){
    local IFS=' '
    ___X_CMD_ARG_LOGGERNAME="$1"
    ___X_CMD_ARG_CMDID="$*"
    ___X_CMD_ARG_HELPCMD="x $* -h"
}

alias arg:init:x='
    2>/dev/null 1>&2 local ___X_CMD_ARG_LOGGERNAME;
    2>/dev/null 1>&2 local ___X_CMD_ARG_CMDID;
    2>/dev/null 1>&2 local ___X_CMD_ARG_HELPCMD;
    ___x_cmd_arg_initx'

alias arg:help='
case "$1" in
    --help|-h)  shift; ___x_cmd help   -c  "$___X_CMD_ARG_CMDID"  "$@" ;   return 0    ;;
    ,)          shift; ___x_cmd co     -c  "$___X_CMD_ARG_CMDID"  "$@" ;   return $?   ;;
    ,,)         shift; ___x_cmd coco   -c  "$___X_CMD_ARG_CMDID"  "$@" ;   return $?   ;;
esac
'

# Section B:

# Introduce a concept in is
___x_cmd_arg___in(){
    [ -n "$1" ] || return 1
    local L="|${L}|";
    [ "${L#*|"${1}"|}" != "$L" ]
}

___x_cmd_arg___cama(){
    ___x_cmd cama "$1" "${P}"
}

alias arg:1:nonempty='[ -n "$1" ]               ||  M="Please provide non-empty value"                      arg:ret:64'
alias arg:1:int='___x_cmd_is int "$1"           ||  M="Please provide int value. Current value is $1"       arg:ret:64'
alias arg:1:float='___x_cmd_is float "$1"       ||  M="Please provide float value. Current value is $1"     arg:ret:64'
alias arg:1:cama='___x_cmd_arg___cama "$1"      ||  M="Invalid Value $1"                                    arg:ret:64'
alias arg:1:in'=___x_cmd_arg___in "$1"          ||  M="Invalid Value $1"                                    arg:ret:64'

alias arg:2:nonempty='[ -n "$2" ]               ||  M="Please provide non-empty value following $1"         arg:ret:64'
alias arg:2:int='___x_cmd_is int "$2"           ||  M="Please provide int value following $1 ==> $2"        arg:ret:64'
alias arg:2:float='___x_cmd_is float "$2"       ||  M="Please provide float value following $1 ==> $2"      arg:ret:64'
alias arg:2:cama='___x_cmd_arg___cama "$2"      ||  M="Invalid Value following $1 ==> $2"                   arg:ret:64'
alias arg:2:in='___x_cmd_arg___in "$2"          ||  M="Invalid Value following $1 ==> $2"                   arg:ret:64'

alias arg:2:shift='[ $# -ge 2 ]                 ||  M="Option requires more than 1 argument -> $1"          arg:ret:64;  shift 2'

# alias cmdstr:shift:2='[ $# -gt 2 ] || N=alpine M="Option requires more than 1 argument -> $1" log:ret:64;  shift 2'

alias arg:add='___x_cmd cmdstr'

___x_cmd_arg___kv(){
    ___x_cmd cmdstr "$N" "$K" "$V"  ; shift 2
}

alias arg:2:kv='[ $# -ge 2 ] || M="Option requires more than 1 argument -> $1"          arg:ret:64; ___x_cmd_arg___kv; shift 2'

alias arg:invalid:ret:64='M="Unknown options -> $1"          arg:ret:64'
