// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

/*
 * This has the docs for all the generated vdl errors.  Ideally this would be
 * generated by the compiler, but right now the vdl file does not have enough
 * info to generate linked docs.  Instead this is hand generated and needed
 * to be kept up to date with the vdl file.
 */
/**
 * UnknownError means the error has no known Id.  A more specific error should
 * always be used, if possible.  Unknown is typically only used when
 * automatically converting errors that do not contain an Id.
 * @name UnknownError
 * @constructor
 * @param {module:vanadium.context.Context} ctx The context the error was
 * created in.
 * @param {...*} params A list of parameters to include in the error message.
 * @memberof module:vanadium.verror
 * @augments module:vanadium.verror.VanadiumError
 */
/**
 * InternalError means an internal error has occurred.  A more specific error
 * should always be used, if possible.
 * @name InternalError
 * @constructor
 * @param {module:vanadium.context.Context} ctx The context the error was
 * created in.
 * @param {...*} params A list of parameters to include in the error message.
 * @memberof module:vanadium.verror
 * @augments module:vanadium.verror.VanadiumError
 */
/**
 * NotImplementedError means that the request type is valid but that the method
 * to handle the request has not been implemented.
 * @param {module:vanadium.context.Context} ctx The context the error was
 * created in.
 * @param {...*} params A list of parameters to include in the error message.
 * @name NotImplementedError
 * @constructor
 * @memberof module:vanadium.verror
 * @augments module:vanadium.verror.VanadiumError
 */
/**
 * EndOfFileError means the end-of-file has been reached; more generally, no
 * more input data is available.
 * @param {module:vanadium.context.Context} ctx The context the error was
 * created in.
 * @param {...*} params A list of parameters to include in the error message.
 * @name EndOfFileError
 * @constructor
 * @memberof module:vanadium.verror
 * @augments module:vanadium.verror.VanadiumError
 */
/**
 * BadArgError means the arguments to an operation are invalid or incorrectly
 * formatted.
 * @param {module:vanadium.context.Context} ctx The context the error was
 * created in.
 * @param {...*} params A list of parameters to include in the error message.
 * @name BadArgError
 * @constructor
 * @memberof module:vanadium.verror
 * @augments module:vanadium.verror.VanadiumError
 */
/**
 * BadStateError means an operation was attempted on an object while the object
 * was in an incompatible state.
 * @param {module:vanadium.context.Context} ctx The context the error was
 * created in.
 * @param {...*} params A list of parameters to include in the error message.
 * @name BadStateError
 * @constructor
 * @memberof module:vanadium.verror
 * @augments module:vanadium.verror.VanadiumError
 */
/**
 * BadVersion means the version presented by the client (e.g. to a service
 * that supports content-hash-based caching or atomic read-modify-write) was
 * out of date or otherwise invalid, likely because some other request caused
 * the version at the server to change. The client should get a fresh version
 * and try again.
 * @param {module:vanadium.context.Context} ctx The context the error was
 * created in.
 * @param {...*} params A list of parameters to include in the error message.
 * @name BadVersionError
 * @constructor
 * @memberof module:vanadium.verror
 * @augments module:vanadium.verror.VanadiumError
 */
/**
 * ExistError means that the requested item already exists; typically returned
 * when an attempt to create an item fails because it already exists.
 * @param {module:vanadium.context.Context} ctx The context the error was
 * created in.
 * @param {...*} params A list of parameters to include in the error message.
 * @name ExistError
 * @constructor
 * @memberof module:vanadium.verror
 * @augments module:vanadium.verror.VanadiumError
 */
/**
 * NoExistError means that the requested item does not exist; typically returned
 * when an attempt to lookup an item fails because it does not exist.
 * @param {module:vanadium.context.Context} ctx The context the error was
 * created in.
 * @param {...*} params A list of parameters to include in the error message.
 * @name NoExistError
 * @constructor
 * @memberof module:vanadium.verror
 * @augments module:vanadium.verror.VanadiumError
 */
/**
 * NoExistOrNoAccessError means that either the requested item does not exist,
 * or is inaccessible.  Typically returned when the distinction between
 * existence and inaccessiblity should be hidden to preserve privacy.
 * @param {module:vanadium.context.Context} ctx The context the error was
 * created in.
 * @param {...*} params A list of parameters to include in the error message.
 * @name NoExistOrNoAccessError
 * @constructor
 * @memberof module:vanadium.verror
 * @augments module:vanadium.verror.VanadiumError
 */
/**
 * NoServersError means a name was resolved to unusable or inaccessible servers.
 * @param {module:vanadium.context.Context} ctx The context the error was
 * created in.
 * @param {...*} params A list of parameters to include in the error message.
 * @name NoServersError
 * @constructor
 * @memberof module:vanadium.verror
 * @augments module:vanadium.verror.VanadiumError
 */
/**
 * NoAccessError means the server does not authorize the client for access.
 * @param {module:vanadium.context.Context} ctx The context the error was
 * created in.
 * @param {...*} params A list of parameters to include in the error message.
 * @name NotAccessError
 * @constructor
 * @memberof module:vanadium.verror
 * @augments module:vanadium.verror.VanadiumError
 */
/**
 * NotTrustedError means the client does not trust the server.
 * @param {module:vanadium.context.Context} ctx The context the error was
 * created in.
 * @param {...*} params A list of parameters to include in the error message.
 * @name NotTrustedError
 * @constructor
 * @memberof module:vanadium.verror
 * @augments module:vanadium.verror.VanadiumError
 */
/**
 * AbortedError means that an operation was not completed because it was aborted
 * by the receiver.  A more specific error should be used if it would help the
 * caller decide how to proceed.
 * @param {module:vanadium.context.Context} ctx The context the error was
 * created in.
 * @param {...*} params A list of parameters to include in the error message.
 * @name AbortedError
 * @constructor
 * @memberof module:vanadium.verror
 * @augments module:vanadium.verror.VanadiumError
 */
/**
 * BadProtocolError means that an operation was not completed because of a
 * protocol or codec error.
 * @param {module:vanadium.context.Context} ctx The context the error was
 * created in.
 * @param {...*} params A list of parameters to include in the error message.
 * @name BadProtocolError
 * @constructor
 * @memberof module:vanadium.verror
 * @augments module:vanadium.verror.VanadiumError
 */
/**
 * CanceledError means the operation was not completed because it was explicitly
 * cancelled by the caller.
 * @param {module:vanadium.context.Context} ctx The context the error was
 * created in.
 * @param {...*} params A list of parameters to include in the error message.
 * @name CanceledError
 * @constructor
 * @memberof module:vanadium.verror
 * @augments module:vanadium.verror.VanadiumError
 */
/**
 * TimeoutError means that an operation was not completed before the time
 * deadline for the operation.
 * @param {module:vanadium.context.Context} ctx The context the error was
 * created in.
 * @param {...*} params A list of parameters to include in the error message.
 * @name TimeoutError
 * @constructor
 * @memberof module:vanadium.verror
 * @augments module:vanadium.verror.VanadiumError
 */
