| // Copyright 2021 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef DIAGNOSTICS_COMMON_DBUS_UTILS_H_ |
| #define DIAGNOSTICS_COMMON_DBUS_UTILS_H_ |
| |
| #include <utility> |
| |
| #include <base/callback.h> |
| #include <base/callback_helpers.h> |
| #include <brillo/errors/error.h> |
| |
| namespace diagnostics { |
| |
| // SplitDbusCallback turns a callback into two callbacks, one for results, |
| // another for error. This is for who want to use one callback to handle the |
| // result from dbus binding. |
| // It turns |void(err, result...)| into |void(result...)| and |void(err)|. |
| template <typename... Args> |
| auto SplitDbusCallback( |
| base::OnceCallback<void(brillo::Error*, Args...)>&& callback) { |
| auto [cb1, cb2] = base::SplitOnceCallback(std::move(callback)); |
| auto on_success = base::BindOnce( |
| [](base::OnceCallback<void(brillo::Error*, Args...)>&& callback, |
| Args... args) { std::move(callback).Run(nullptr, args...); }, |
| std::move(cb1)); |
| auto on_error = base::BindOnce( |
| [](base::OnceCallback<void(brillo::Error*, Args...)>&& callback, |
| brillo::Error* err) { std::move(callback).Run(err, Args{}...); }, |
| std::move(cb2)); |
| return std::make_pair(std::move(on_success), std::move(on_error)); |
| } |
| |
| } // namespace diagnostics |
| |
| #endif // DIAGNOSTICS_COMMON_DBUS_UTILS_H_ |