#!/bin/bash
# -----------------------------------------------------------------------
# Copyright 2024 Open Networking Foundation Contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http:#www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# -----------------------------------------------------------------------
# SPDX-FileCopyrightText: 2024 Open Networking Foundation Contributors
# SPDX-License-Identifier: Apache-2.0
## --------------------------------------------------------------------
## Intent:
## --------------------------------------------------------------------

## --------------------------------------------------------------------
## --------------------------------------------------------------------
function help_read()
{
    local -n ref=$1; shift
    local path="$1"; shift

    readarray text < <(grep -v -e '^#' "$path")
    ref+=("${text[@]}")

    return
}

## --------------------------------------------------------------------
## --------------------------------------------------------------------
function help_switch_show()
{
    local -a buffer=()

    local helpwith
    for helpwith in "$@"; do
        local path="$pgm_help/${helpwith}.switches"
        if [[ ! -e "$path" ]]; then
            readarray fyls < <(find "$pgm_help" -name '*.switches')
            echo "--usage-${helpwith} does not exist"
            echo "Try one of:"
            printf "  %s\n" "${fyls[@]}"
            error "OUTA HERE"
        fi
        help_read buffer "$path"
    done

    printf '%s' "${buffer[@]}"
    return
}

## --------------------------------------------------------------------
## --------------------------------------------------------------------
function help_usage_show()
{
    local -a buffer=()

    local helpwith
    for helpwith in "$@"; do
        local path="$pgm_help/${helpwith}.usage"
        if [[ ! -e "$path" ]]; then
            readarray fyls < <(find "$pgm_help" -name '*.usage')
            echo "--usage-${helpwith} does not exist"
            echo "Try one of:"
            printf "  %s\n" "${fyls[@]}"
            error "OUTA HERE"
        fi
        help_read buffer "$path"
    done

    printf '%s' "${buffer[@]}"
    return
}

## --------------------------------------------------------------------
## --------------------------------------------------------------------
function help_with()
{
    help_switch_show "$@"
    help_usage_show "$@"
}

# [EOF]
