blob: 186e394fd3463dc95ec19b38dc4ea67b0d5293b0 [file] [log] [blame]
// Copyright 2022 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 "src/developer/debug/zxdb/console/command_sequence.h"
#include "src/developer/debug/shared/message_loop.h"
#include "src/developer/debug/shared/string_util.h"
#include "src/developer/debug/zxdb/console/console.h"
#include "src/lib/files/file.h"
#include "src/lib/fxl/strings/split_string.h"
namespace zxdb {
namespace {
// Returns a child CommandContext of the given one. Upon completion, this child will run the
// next command in the sequence.
fxl::RefPtr<CommandContext> MakeSequencedCommandContext(std::vector<std::string> commands,
size_t next_index,
fxl::RefPtr<CommandContext> cmd_context) {
return fxl::MakeRefCounted<NestedCommandContext>(
cmd_context,
[commands = std::move(commands), next_index, cmd_context](const Err& err) mutable {
if (err.has_error())
return; // Can't continue.
if (next_index >= commands.size())
return; // Success.
debug::MessageLoop::Current()->PostTask(
FROM_HERE, [commands = std::move(commands), next_index, cmd_context]() {
if (!cmd_context->console())
return;
std::string cur_line = commands[next_index];
cmd_context->console()->ProcessInputLine(
cur_line,
MakeSequencedCommandContext(std::move(commands), next_index + 1,
std::move(cmd_context)),
false);
});
});
}
} // namespace
void RunCommandSequence(Console* console, std::vector<std::string> commands,
fxl::RefPtr<CommandContext> cmd_context) {
if (commands.empty())
return;
auto weak_console = console->GetWeakPtr();
std::string cur_line = commands[0];
console->ProcessInputLine(
cur_line, MakeSequencedCommandContext(std::move(commands), 1, std::move(cmd_context)), false);
}
ErrOr<std::vector<std::string>> ReadCommandsFromFile(const std::string& path) {
std::string contents;
if (!files::ReadFileToString(path, &contents))
return Err("Could not read file \"" + path + "\"");
std::vector<std::string> result;
for (auto& cmd :
fxl::SplitStringCopy(contents, "\n", fxl::kTrimWhitespace, fxl::kSplitWantNonEmpty)) {
if (!cmd.empty() && !debug::StringStartsWith(cmd, "#"))
result.push_back(std::move(cmd));
}
return result;
}
} // namespace zxdb