/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
/*
 *   Copyright 2020-Present Couchbase, Inc.
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 */

#pragma once

namespace couchbase
{
/**
 * This enum defines known attributes, that could be associated with the error code in the error map.
 * Complete list could be found at https://github.com/couchbase/kv_engine/blob/master/docs/ErrorMap.md#error-attributes.
 */
enum class key_value_error_map_attribute {
    /**
     * The operation was successful for those situations where the error code is indicating successful (i.e. subdocument operations
     * carried out on a deleted document)
     */
    success,

    /**
     * This attribute means that the error is related to a constraint failure regarding the item itself, i.e. the item does not exist,
     * already exists, or its current value makes the current operation impossible. Retrying the operation when the item's value or
     * status has changed may succeed.
     */
    item_only,

    /**
     * This attribute means that a user's input was invalid because it violates the semantics of the operation, or exceeds some
     * predefined limit.
     */
    invalid_input,

    /**
     * The client's cluster map may be outdated and requires updating. The client should obtain a newer configuration.
     */
    fetch_config,

    /**
     * The current connection is no longer valid. The client must reconnect to the server. Note that the presence of other attributes
     * may indicate an alternate remedy to fixing the connection without a disconnect, but without special remedial action a disconnect
     * is needed.
     */
    conn_state_invalidated,

    /**
     * The operation failed because the client failed to authenticate or is not authorized to perform this operation. Note that this
     * error in itself does not mean the connection is invalid, unless conn-state-invalidated is also present.
     */
    auth,

    /**
     * This error code must be handled specially. If it is not handled, the connection must be dropped.
     */
    special_handling,

    /**
     * The operation is not supported, possibly because the of server version, bucket type, or current user.
     */
    support,

    /**
     * This error is transient. Note that this does not mean the error is retriable.
     */
    temp,

    /**
     * This is an internal error in the server.
     */
    internal,

    /**
     * The operation may be retried immediately.
     */
    retry_now,

    /**
     * The operation may be retried after some time.
     */
    retry_later,

    /**
     * The error is related to the subdocument subsystem.
     */
    subdoc,

    /**
     * The error is related to the DCP subsystem.
     */
    dcp,

    /**
     * Use retry specifications from the server.
     */
    auto_retry,

    /**
     * This attribute means that the error is related to operating on a locked document.
     */
    item_locked,

    /**
     * This attribute means that the error is related to operating on a soft-deleted document.
     */
    item_deleted,

    /**
     * The error is related to rate limitation for the client (version 2)
     */
    rate_limit,
};
} // namespace couchbase