// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.

#include "diskann/ann_exception.h"
#include <sstream>
#include <string>

namespace diskann {
  ANNException::ANNException(const std::string& message, int errorCode)
      : std::runtime_error(message), _errorCode(errorCode) {
  }

  std::string package_string(const std::string& item_name,
                             const std::string& item_val) {
    return std::string("[") + item_name + ": " + std::string(item_val) +
           std::string("]");
  }

  ANNException::ANNException(const std::string& message, int errorCode,
                             const std::string& funcSig,
                             const std::string& fileName, unsigned lineNum)
      : ANNException(
            package_string(std::string("FUNC"), funcSig) +
                package_string(std::string("FILE"), fileName) +
                package_string(std::string("LINE"), std::to_string(lineNum)) +
                message,
            errorCode) {
  }

  FileException::FileException(const std::string& filename,
                               std::system_error& e, const std::string& funcSig,
                               const std::string& fileName,
                               unsigned int       lineNum)
      : ANNException(std::string(" While opening file \'") + filename +
                         std::string("\', error code: ") +
                         std::to_string(e.code().value()) + "  " +
                         e.code().message(),
                     e.code().value(), funcSig, fileName, lineNum) {
  }

}  // namespace diskann
