| // Copyright 2018 The ChromiumOS Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "runtime_probe/functions/sequence.h" | |
| #include <utility> | |
| #include <base/functional/bind.h> | |
| #include <base/functional/callback.h> | |
| #include <base/logging.h> | |
| #include <base/values.h> | |
| namespace runtime_probe { | |
| void SequenceFunction::RunNext(base::OnceCallback<void(DataType)> callback, | |
| int idx, | |
| base::Value::Dict result_dict, | |
| SequenceFunction::DataType probe_result) const { | |
| if (probe_result.size() == 0) { | |
| std::move(callback).Run({}); | |
| return; | |
| } | |
| if (probe_result.size() > 1) { | |
| LOG(ERROR) << "Subfunction call generates more than one results."; | |
| std::move(callback).Run({}); | |
| return; | |
| } | |
| result_dict.Merge(probe_result[0].GetDict().Clone()); | |
| if (idx >= functions_.size()) { | |
| DataType results; | |
| results.Append(std::move(result_dict)); | |
| std::move(callback).Run(std::move(results)); | |
| return; | |
| } | |
| functions_[idx]->Eval( | |
| base::BindOnce(&SequenceFunction::RunNext, base::Unretained(this), | |
| std::move(callback), idx + 1, std::move(result_dict))); | |
| } | |
| void SequenceFunction::EvalAsyncImpl( | |
| base::OnceCallback<void(DataType)> callback) const { | |
| if (functions_.size() == 0) { | |
| std::move(callback).Run({}); | |
| } | |
| callback = base::BindOnce(&SequenceFunction::RunNext, base::Unretained(this), | |
| std::move(callback), 1, base::Value::Dict{}); | |
| functions_[0]->Eval(std::move(callback)); | |
| } | |
| } // namespace runtime_probe |