/*
 *    Copyright (c) 2024 Project CHIP Authors
 *
 *    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.
 */

#pragma once

#include <lib/shell/Command.h>
#include <lib/support/Span.h>

namespace chip {
namespace Shell {

/**
 * Shell command set.
 *
 * The shell command set is a thin wrapper for the span of commands.
 * It facilitates executing a matching shell command for the given input arguments.
 */
class CommandSet
{
public:
    template <size_t N>
    constexpr CommandSet(const Command (&commands)[N]) : mCommands(commands)
    {}

    /**
     * Dispatch and execute the command for the given argument list.
     *
     * The first argument is used to select the command to be executed and
     * the remaining arguments are forwarded to the command's handler.
     * If no argument has been provided or the first argument is "help", then
     * the function prints help text for each command and returns no error.
     *
     * @param argc  Number of arguments in argv.
     * @param argv  Array of arguments in the tokenized command line to execute.
     */
    CHIP_ERROR ExecCommand(int argc, char * argv[]) const;

private:
    void ShowHelp() const;

    Span<const Command> mCommands;
};

} // namespace Shell
} // namespace chip
