blob: 296ffd9a6db32e9ee782a14519c90211faaf3ce8 [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 "err.h"
#include <lib/syslog/cpp/macros.h>
#include <stdarg.h>
#include "src/developer/debug/shared/status.h"
#include "src/lib/fxl/strings/string_printf.h"
#include "src/lib/unwinder/error.h"
namespace zxdb {
Err::Err() = default;
Err::Err(ErrType type, const std::string& msg) : type_(type), msg_(msg) {}
Err::Err(const std::string& msg) : type_(ErrType::kGeneral), msg_(msg) {}
Err::Err(const debug::Status& debug_status) {
switch (debug_status.type()) {
case debug::Status::kSuccess:
type_ = ErrType::kNone;
break;
case debug::Status::kGenericError:
case debug::Status::kPlatformError:
// We currently don't preserve the platform error code, but assume that it's been
// stringified into a reasonable message.
type_ = ErrType::kGeneral;
msg_ = debug_status.message();
break;
case debug::Status::kNotSupported:
type_ = ErrType::kNotSupported;
msg_ = debug_status.message();
break;
case debug::Status::kNotFound:
type_ = ErrType::kNotFound;
msg_ = debug_status.message();
break;
case debug::Status::kAlreadyExists:
type_ = ErrType::kAlreadyExists;
msg_ = debug_status.message();
break;
case debug::Status::kNoResources:
type_ = ErrType::kNoResources;
msg_ = debug_status.message();
break;
case debug::Status::kLast:
FX_NOTREACHED();
type_ = ErrType::kGeneral;
break;
}
}
Err::Err(const char* fmt, ...) : type_(ErrType::kGeneral) {
va_list ap;
va_start(ap, fmt);
msg_ = fxl::StringVPrintf(fmt, ap);
va_end(ap);
}
Err::~Err() = default;
bool Err::operator==(const Err& other) const { return type_ == other.type_ && msg_ == other.msg_; }
std::string Err::ToString() const {
std::string ret = ErrTypeToString(type());
ret += ": ";
ret += msg();
return ret;
}
std::string ErrTypeToString(ErrType type) {
switch (type) {
case ErrType::kNone:
return "Ok";
case ErrType::kGeneral:
return "General";
case ErrType::kCanceled:
return "Canceled";
case ErrType::kNoConnection:
return "NoConnection";
case ErrType::kCorruptMessage:
return "CorruptMessage";
case ErrType::kClientApi:
return "ClientApi";
case ErrType::kNotSupported:
return "NotSupported";
case ErrType::kNotFound:
return "NotFound";
case ErrType::kAlreadyExists:
return "AlreadyExists";
case ErrType::kNoResources:
return "NoResources";
case ErrType::kInput:
return "Input";
case ErrType::kOptimizedOut:
return "OptimizedOut";
case ErrType::kUnsupported:
return "Unsupported";
}
}
unwinder::Error ErrToUnwinderError(const Err& err) {
if (err.ok()) {
return unwinder::Success();
}
return unwinder::Error(err.msg());
}
} // namespace zxdb