blob: 6c41a9708606317bdad9ba960ba51a4a712d40e5 [file] [log] [blame]
/*
* Copyright (c) 2021 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_LOG_PARSE_STATUS_H_
#define LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_LOG_PARSE_STATUS_H_
#include <string>
#include "absl/base/attributes.h"
#include "absl/strings/string_view.h"
#include "rtc_base/checks.h"
#define RTC_PARSE_RETURN_ERROR(X) \
do { \
return RtcEventLogParseStatus::Error(#X, __FILE__, __LINE__); \
} while (0)
#define RTC_PARSE_CHECK_OR_RETURN(X) \
do { \
if (!(X)) \
return RtcEventLogParseStatus::Error(#X, __FILE__, __LINE__); \
} while (0)
#define RTC_PARSE_CHECK_OR_RETURN_MESSAGE(X, M) \
do { \
if (!(X)) \
return RtcEventLogParseStatus::Error((M), __FILE__, __LINE__); \
} while (0)
#define RTC_PARSE_CHECK_OR_RETURN_OP(OP, X, Y) \
do { \
if (!((X)OP(Y))) \
return RtcEventLogParseStatus::Error(#X #OP #Y, __FILE__, __LINE__); \
} while (0)
#define RTC_PARSE_CHECK_OR_RETURN_EQ(X, Y) \
RTC_PARSE_CHECK_OR_RETURN_OP(==, X, Y)
#define RTC_PARSE_CHECK_OR_RETURN_NE(X, Y) \
RTC_PARSE_CHECK_OR_RETURN_OP(!=, X, Y)
#define RTC_PARSE_CHECK_OR_RETURN_LT(X, Y) RTC_PARSE_CHECK_OR_RETURN_OP(<, X, Y)
#define RTC_PARSE_CHECK_OR_RETURN_LE(X, Y) \
RTC_PARSE_CHECK_OR_RETURN_OP(<=, X, Y)
#define RTC_PARSE_CHECK_OR_RETURN_GT(X, Y) RTC_PARSE_CHECK_OR_RETURN_OP(>, X, Y)
#define RTC_PARSE_CHECK_OR_RETURN_GE(X, Y) \
RTC_PARSE_CHECK_OR_RETURN_OP(>=, X, Y)
#define RTC_PARSE_WARN_AND_RETURN_SUCCESS_IF(X, M) \
do { \
if (X) { \
RTC_LOG(LS_WARNING) << (M); \
return RtcEventLogParseStatus::Success(); \
} \
} while (0)
#define RTC_RETURN_IF_ERROR(X) \
do { \
const RtcEventLogParseStatus _rtc_parse_status(X); \
if (!_rtc_parse_status.ok()) { \
return _rtc_parse_status; \
} \
} while (0)
// TODO(terelius): Compared to a generic 'Status' class, this
// class allows us additional information about the context
// in which the error occurred. This is currently limited to
// the source location (file and line), but we plan on adding
// information about the event and field name being parsed.
// If/when we start using absl::Status in WebRTC, consider
// whether payloads would be an appropriate alternative.
class RtcEventLogParseStatus {
template <typename T>
friend class RtcEventLogParseStatusOr;
public:
static RtcEventLogParseStatus Success() { return RtcEventLogParseStatus(); }
static RtcEventLogParseStatus Error(absl::string_view error,
absl::string_view file,
int line) {
return RtcEventLogParseStatus(error, file, line);
}
bool ok() const { return error_.empty(); }
ABSL_DEPRECATED("Use ok() instead") explicit operator bool() const {
return ok();
}
std::string message() const { return error_; }
private:
RtcEventLogParseStatus() : error_() {}
RtcEventLogParseStatus(absl::string_view error,
absl::string_view file,
int line)
: error_(std::string(error) + " (" + std::string(file) + ": " +
std::to_string(line) + ")") {}
std::string error_;
};
template <typename T>
class RtcEventLogParseStatusOr {
public:
RtcEventLogParseStatusOr(RtcEventLogParseStatus status) // NOLINT
: status_(status), value_() {}
RtcEventLogParseStatusOr(const T& value) // NOLINT
: status_(), value_(value) {}
bool ok() const { return status_.ok(); }
std::string message() const { return status_.message(); }
RtcEventLogParseStatus status() const { return status_; }
const T& value() const {
RTC_DCHECK(ok());
return value_;
}
T& value() {
RTC_DCHECK(ok());
return value_;
}
static RtcEventLogParseStatusOr Error(absl::string_view error,
absl::string_view file,
int line) {
return RtcEventLogParseStatusOr(error, file, line);
}
private:
RtcEventLogParseStatusOr() : status_() {}
RtcEventLogParseStatusOr(absl::string_view error,
absl::string_view file,
int line)
: status_(error, file, line), value_() {}
RtcEventLogParseStatus status_;
T value_;
};
#endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_LOG_PARSE_STATUS_H_