blob: 4aebbaa88c2971d7941c5ec7b46aa83016513182 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <fbl/macros.h>
#include <lib/fit/function.h>
#include <map>
#include "src/lib/fxl/command_line.h"
namespace bluetooth_tools {
// CommandDispatcher is a mapping between commands (identified by a string and
// arguments) and handler functions that should be executed.
class CommandDispatcher final {
CommandDispatcher() = default;
// Invokes the handler for the command described by |argv|. Returns true if
// the command was successfully handled, in which case |complete_cb| will be
// executed asynchronously to signal command completion.
// Returns false if the command could not be handled, either because |argv|
// contained invalid arguments or if no handler for the command had been
// previously registered. |out_cmd_found| will be set to false if no command
// handler for this command was registered, true otherwise.
bool ExecuteCommand(const std::vector<std::string>& argv, fit::closure complete_cb,
bool* out_cmd_found);
// Prints the names of all commands and their descriptions.
void DescribeAllCommands() const;
// Each handler is provided with a |command_line| that can be used to obtain
// positional arguments and options that were passed to the command. If
// |command_line| returns malformed or invalid arguments, the handler MUST
// return false. Otherwise if the command can is expressed properly and it is
// accepted by the handler, the handler MUST return true.
// Once a command has been executed, |complete_cb| should be called to mark
// completion the of the command.
using CommandHandler =
fit::function<bool(const fxl::CommandLine& command_line, fit::closure complete_cb)>;
// Registers a handler to be executed for the command |command_name|.
// |description| is the string that describes the command (to be displayed by
// DescribedAllCommands()).
void RegisterHandler(const std::string& command_name, const std::string& description,
CommandHandler handler);
// Returns a list of currently registered command names that start with
// |prefix|.
std::vector<std::string> GetCommandsThatMatch(const std::string& prefix) const;
struct CommandHandlerData {
CommandHandlerData(const std::string& description, CommandHandler handler);
CommandHandlerData() = default;
std::string description;
CommandHandler handler;
std::map<std::string, CommandHandlerData> handler_map_;
} // namespace bluetooth_tools