blob: 4da76ae5350d6e0f9fe0f96da5647dd46cf75c7c [file] [log] [blame]
// Copyright 2017 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/ledger/bin/testing/quit_on_error.h"
#include <lib/fit/function.h>
#include <zircon/errors.h>
#include <zircon/status.h>
#include <sstream>
namespace ledger {
namespace internal {
namespace {
template <typename E>
std::string FidlEnumToString(E e) {
std::stringstream ss;
ss << fidl::ToUnderlying(e);
return ss.str();
}
template <>
std::string FidlEnumToString<zx_status_t>(zx_status_t status) {
return zx_status_get_string(status);
}
template <typename R>
std::string FidlResultToString(const R& r) {
if (r.is_response()) {
return "";
}
return FidlEnumToString(r.err());
};
} // namespace
StatusTranslater::StatusTranslater(Status status)
: ok_(status == Status::OK), description_(FidlEnumToString(status)) {}
StatusTranslater::StatusTranslater(zx_status_t status)
: ok_(status == ZX_OK || status == ZX_ERR_PEER_CLOSED),
description_(zx_status_get_string(status)) {}
StatusTranslater::StatusTranslater(
const fuchsia::ledger::Page_CreateReferenceFromBuffer_Result& result)
: ok_(result.is_response()), description_(FidlResultToString(result)) {}
StatusTranslater::StatusTranslater(const fuchsia::ledger::PageSnapshot_Get_Result& result)
: ok_(result.is_response()), description_(FidlResultToString(result)) {}
StatusTranslater::StatusTranslater(const fuchsia::ledger::PageSnapshot_GetInline_Result& result)
: ok_(result.is_response()), description_(FidlResultToString(result)) {}
StatusTranslater::StatusTranslater(const fuchsia::ledger::PageSnapshot_Fetch_Result& result)
: ok_(result.is_response()), description_(FidlResultToString(result)) {}
StatusTranslater::StatusTranslater(const fuchsia::ledger::PageSnapshot_FetchPartial_Result& result)
: ok_(result.is_response()), description_(FidlResultToString(result)) {}
} // namespace internal
bool QuitOnError(fit::closure quit_callback, internal::StatusTranslater status,
fxl::StringView description) {
if (status.ok()) {
return false;
}
FXL_LOG(ERROR) << description << " failed with status " << status.description() << ".";
quit_callback();
return true;
}
} // namespace ledger