blob: a5e93c8fd6439629c129d82d43d6e27ccfb6f824 [file] [log] [blame]
// Copyright 2018 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 "peridot/bin/sessionmgr/puppet_master/story_command_executor.h"
#include <lib/fxl/functional/make_copyable.h>
namespace modular {
namespace {
std::vector<fuchsia::modular::StoryCommand> CloneCommands(
const std::vector<fuchsia::modular::StoryCommand>& commands) {
std::vector<fuchsia::modular::StoryCommand> commands_copy;
for (const auto& command : commands) {
fuchsia::modular::StoryCommand clone;
command.Clone(&clone);
commands_copy.push_back(std::move(clone));
}
return commands_copy;
}
} // namespace
StoryCommandExecutor::StoryCommandExecutor() : weak_factory_(this) {}
StoryCommandExecutor::~StoryCommandExecutor() = default;
void StoryCommandExecutor::ExecuteCommands(
fidl::StringPtr story_id,
std::vector<fuchsia::modular::StoryCommand> commands,
std::function<void(fuchsia::modular::ExecuteResult)> done) {
// TODO(thatguy): Cloning the commands here is unforunate. We will want to
// create a shared datastructure at some point, such as a
// ExecuteCommandsContext struct that contains the commands, and also allows
// command runners to make modifications to the commands so that observers get
// commands that are more fully specified.
//
// For now, we make a copy.
auto commands_copy = CloneCommands(commands);
auto on_execute_done =
[weak_this = weak_factory_.GetWeakPtr(),
commands_copy = std::move(commands_copy),
done = std::move(done)](fuchsia::modular::ExecuteResult result) {
if (!weak_this)
return;
for (auto& listener : weak_this->listeners_) {
listener(commands_copy, result);
}
done(result);
};
ExecuteCommandsInternal(std::move(story_id), std::move(commands),
fxl::MakeCopyable(std::move(on_execute_done)));
}
StoryCommandExecutor::ListenerAutoCancel StoryCommandExecutor::AddListener(
ListenerCallback listener) {
auto it = listeners_.insert(listeners_.end(), std::move(listener));
auto auto_remove = [weak_this = weak_factory_.GetWeakPtr(), it] {
if (!weak_this)
return;
weak_this->listeners_.erase(it);
};
return ListenerAutoCancel(std::move(auto_remove));
}
} // namespace modular