blob: b33a13d37e23b8ac372d090d2722a7f67e7b0097 [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 "command_dispatcher.h"
#include <lib/syslog/cpp/macros.h>
#include <algorithm>
#include <cstdio>
namespace bluetooth_tools {
CommandDispatcher::CommandHandlerData::CommandHandlerData(const std::string& description,
CommandHandler handler)
: description(description), handler(std::move(handler)) {}
bool CommandDispatcher::ExecuteCommand(const std::vector<std::string>& argv,
fit::closure complete_cb, bool* out_cmd_found) {
FX_DCHECK(out_cmd_found);
*out_cmd_found = false;
if (argv.empty()) {
return false;
}
const auto& iter = handler_map_.find(argv[0]);
if (iter == handler_map_.end()) {
return false;
}
*out_cmd_found = true;
auto cl = fxl::CommandLineFromIterators(argv.begin(), argv.end());
return iter->second.handler(cl, std::move(complete_cb));
}
void CommandDispatcher::DescribeAllCommands() const {
for (const auto& iter : handler_map_) {
std::printf(" %-20s %s\n", iter.first.c_str(), iter.second.description.c_str());
}
}
void CommandDispatcher::RegisterHandler(const std::string& name, const std::string& description,
CommandHandler handler) {
FX_DCHECK(!name.empty());
FX_DCHECK(!description.empty());
FX_DCHECK(handler_map_.find(name) == handler_map_.end());
handler_map_[name] = CommandHandlerData(description, std::move(handler));
}
std::vector<std::string> CommandDispatcher::GetCommandsThatMatch(const std::string& prefix) const {
std::vector<std::string> result;
for (auto& iter : handler_map_) {
auto& cmd_name = iter.first;
if (prefix.length() > cmd_name.length()) {
continue;
}
if (cmd_name.compare(0, prefix.length(), prefix) == 0) {
result.push_back(cmd_name);
}
}
return result;
}
} // namespace bluetooth_tools