blob: 14621ae5fb762126bb7b3a377fafca72aff3d923 [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/command_runners/operation_calls/set_link_value_call.h"
namespace modular {
namespace {
class SetLinkValueCall : public Operation<fuchsia::modular::ExecuteResult> {
public:
SetLinkValueCall(StoryStorage* const story_storage,
fuchsia::modular::LinkPath link_path,
fit::function<void(fidl::StringPtr*)> mutate_fn,
ResultCall done)
: Operation("SetLinkValueCall", std::move(done)),
story_storage_(story_storage),
link_path_(std::move(link_path)),
mutate_fn_(std::move(mutate_fn)) {}
private:
void Run() override {
FlowToken flow{this, &result_};
auto did_update = story_storage_->UpdateLinkValue(
link_path_, std::move(mutate_fn_), this /* context */);
did_update->Then([this, flow](StoryStorage::Status status) {
if (status == StoryStorage::Status::OK) {
result_.status = fuchsia::modular::ExecuteStatus::OK;
} else {
result_.status = fuchsia::modular::ExecuteStatus::INTERNAL_ERROR;
std::stringstream stream;
stream << "StoryStorage error status: " << (uint32_t)status;
result_.error_message = stream.str();
}
});
}
fidl::StringPtr story_id_;
StoryStorage* const story_storage_;
fuchsia::modular::LinkPath link_path_;
fit::function<void(fidl::StringPtr*)> mutate_fn_;
fuchsia::modular::ExecuteResult result_;
};
} // namespace
void AddSetLinkValueOperation(
OperationContainer* const operation_container,
StoryStorage* const story_storage, fuchsia::modular::LinkPath link_path,
fit::function<void(fidl::StringPtr*)> mutate_fn,
fit::function<void(fuchsia::modular::ExecuteResult)> done) {
operation_container->Add(std::make_unique<SetLinkValueCall>(
story_storage, std::move(link_path), std::move(mutate_fn),
std::move(done)));
}
} // namespace modular