# Source: Errors.js

    /*
     * Licensed to the Apache Software Foundation (ASF) under one or more
     * contributor license agreements.  See the NOTICE file distributed with
     * this work for additional information regarding copyright ownership.
     * The ASF licenses this file to You 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.
     */

    'use strict';

    const Util = require('util');

    /**
     * Base Ignite client error class.
     */
    class IgniteClientError extends Error {
        constructor(message) {
            super(message);
        }

        /**
         * Ignite client does not support one of the specified or received data types.
         * @ignore
         */
        static unsupportedTypeError(type) {
            const BinaryUtils = require('./internal/BinaryUtils');
            return new IgniteClientError(Util.format('Type %s is not supported', BinaryUtils.getTypeName(type)));
        }

        /**
         * The real type of data is not equal to the specified one.
         * @ignore
         */
        static typeCastError(fromType, toType) {
            const BinaryUtils = require('./internal/BinaryUtils');
            return new IgniteClientError(Util.format('Type "%s" can not be cast to %s',
                BinaryUtils.getTypeName(fromType), BinaryUtils.getTypeName(toType)));
        }

        /**
         * The real value can not be cast to the specified type.
         * @ignore
         */
        static valueCastError(value, toType) {
            const BinaryUtils = require('./internal/BinaryUtils');
            return new IgniteClientError(Util.format('Value "%s" can not be cast to %s',
                value, BinaryUtils.getTypeName(toType)));
        }

        /**
         * An illegal or inappropriate argument has been passed to the API method.
         * @ignore
         */
        static illegalArgumentError(message) {
            return new IgniteClientError(message);
        }

        /**
         * Ignite client internal error.
         * @ignore
         */
        static internalError(message = null) {
            return new IgniteClientError(message || 'Internal library error');
        }

        /**
         * Serialization/deserialization errors.
         * @ignore
         */
        static serializationError(serialize, message = null) {
            let msg = serialize ? 'Complex object can not be serialized' : 'Complex object can not be deserialized';
            if (message) {
                msg = msg + ': ' + message;
            }
            return new IgniteClientError(msg);
        }
    }

    /**
     * Ignite server returns error for the requested operation.
     * @extends IgniteClientError
     */
    class OperationError extends IgniteClientError {
        constructor(message) {
            super(message);
        }
    }

    /**
     * Ignite client is not in an appropriate state for the requested operation.
     * @extends IgniteClientError
     */
    class IllegalStateError extends IgniteClientError {
        constructor(message = null) {
            super(message || 'Ignite client is not in an appropriate state for the requested operation');
        }
    }

    /**
     * The requested operation is not completed due to the connection lost.
     * @extends IgniteClientError
     */
    class LostConnectionError extends IgniteClientError {
        constructor(message = null) {
            super(message || 'Request is not completed due to the connection lost');
        }
    }

    module.exports.IgniteClientError = IgniteClientError;
    module.exports.OperationError = OperationError;
    module.exports.IllegalStateError = IllegalStateError;
    module.exports.LostConnectionError = LostConnectionError;