# shellcheck shell=sh disable=SC3043
# Section 8: param:flag2bool param:option2json

xrc tmpl # initailize the ___X_CMD_TX for option2json

___x_cmd_param_flag_to_bool(){
    local true="${true:-true}"
    local false="${false:-false}"

    local ___name
    local ___key
    local ___value
    for ___name in "$@"; do
        ___key="${___name%=*}"
        if [ "$___key" = "$___name" ]; then
            if eval [ -n \"\$"$___key"\" ]; then
                eval "$___key=$true"
            else
                eval "$___key=$false"
            fi
            continue
        fi

        ___value="${___name#*=}"
        case "$___value" in
            \^\^*)
                if eval [ -n \"\$"${___value#^^}"\" ]; then
                    eval "$___key=$true"
                else
                    eval "$___key=$false"
                fi
                ;;
            \^*)
                if eval [ -z \"\$"${___value#^}"\" ]; then
                    eval "$___key=$true"
                else
                    eval "$___key=$false"
                fi
                ;;
            *)
                if eval [ -n \"\$"$___value"\" ]; then
                    eval "$___key=$true"
                else
                    eval "$___key=$false"
                fi
        esac
    done
}

alias param:flag2bool=___x_cmd_param_flag_to_bool

# param:option2json repository=repo 'has_wiki=^no_wiki' 'enable_page=^^has_page'
___x_cmd_param_option_to_json()(
    ___code="xrc jo; ___x_cmd_jo dict"
    ___to_remove=""

    for ___name in "$@"; do
        case "$___name" in
            *=\^\^*)      ___key="${___name%%=*}"
                        if eval [ -n \"\$"${___name#*=^^}"\" ]; then
                            eval "$___key=true"
                        else
                            eval "$___key=false"
                        fi
                        ___code="$___code ${___key}"
                        ;;
            *=\^*)       ___key="${___name%%=*}"
                        if eval [ -z \"\$"${___name#*=^}"\" ]; then
                            eval "$___key=true"
                        else
                            eval "$___key=false"
                        fi
                        ___code="$___code ${___key}"
                        ;;
            *=*)        ___key="${___name%%=*}"
                        ___value="${___name#*=}"
                        ___to_remove="$___to_remove ${___value} "
                        ___code="$___code ${___key}=\"\$${___value}\""
                        ;;
            -*)         ___to_remove="$___to_remove ${___name#-} " ;;
            +*)         ___code="$___code ${___name#+}" ;;
            *)          ___code="$___code ${___name}" ;;
        esac
    done

    while read -r ___option_name; do
        eval "[ -z \"\$""$___option_name""\" ] && ___to_remove=\"$___to_remove ${___option_name} \""
        if [ "${___to_remove#* "$___option_name" *}" = "$___to_remove" ]; then
            ___code="$___code $___option_name"
        fi
    done <<A
$(___x_cmd_param_int _ls_option_name)
A
    eval "$___code"
)

alias param:option2json=___x_cmd_param_option_to_json

## EndSection
