blob: 02af189cecf0fc834cab2352f54d12edab5c2224 [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_SYNC_ENGINE_SYNCER_ERROR_H_
#define COMPONENTS_SYNC_ENGINE_SYNCER_ERROR_H_
#include <string>
#include <variant>
#include "components/sync/engine/sync_protocol_error.h"
#include "net/http/http_status_code.h"
namespace syncer {
// This class describes all the possible results of a sync cycle. It should be
// passed by value.
class SyncerError {
public:
enum class Type {
kSuccess,
kNetworkError,
kHttpError,
kProtocolError,
kProtocolViolationError,
kMaxValue = kProtocolViolationError
};
static SyncerError Success();
static SyncerError NetworkError(int error_code);
static SyncerError HttpError(net::HttpStatusCode status_code);
static SyncerError ProtocolError(SyncProtocolErrorType error_type);
static SyncerError ProtocolViolationError();
~SyncerError() = default;
Type type() const { return type_; }
// It is a caller responsibility to ensure right type(). If it doesn't match
// Get..OrDie() will cause a crash.
int GetNetworkErrorOrDie() const;
net::HttpStatusCode GetHttpErrorOrDie() const;
SyncProtocolErrorType GetProtocolErrorOrDie() const;
std::string ToString() const;
private:
struct SuccessValueType {};
struct ProtocolViolationValueType {};
using ValueType = std::variant<SuccessValueType,
int /*network error code*/,
net::HttpStatusCode,
SyncProtocolErrorType,
ProtocolViolationValueType>;
static_assert(std::variant_size<ValueType>::value ==
static_cast<int>(Type::kMaxValue) + 1);
SyncerError(Type type, ValueType value);
Type type_;
ValueType value_;
};
} // namespace syncer
#endif // COMPONENTS_SYNC_ENGINE_SYNCER_ERROR_H_