ct2rs 0.8.2

Rust bindings for OpenNMT/CTranslate2
Documentation
#include "ctranslate2/logging.h"

#include <mutex>

#include <spdlog/sinks/stdout_sinks.h>
#include <spdlog/spdlog.h>

#include "env.h"

namespace ctranslate2 {

  static spdlog::level::level_enum to_spdlog_level(const LogLevel level) {
    switch (level) {
    case LogLevel::Off:
      return spdlog::level::off;
    case LogLevel::Critical:
      return spdlog::level::critical;
    case LogLevel::Error:
      return spdlog::level::err;
    case LogLevel::Warning:
      return spdlog::level::warn;
    case LogLevel::Info:
      return spdlog::level::info;
    case LogLevel::Debug:
      return spdlog::level::debug;
    case LogLevel::Trace:
      return spdlog::level::trace;
    default:
      throw std::invalid_argument("Invalid log level");
    }
  }

  static LogLevel to_ct2_level(const spdlog::level::level_enum level) {
    switch (level) {
    case spdlog::level::off:
      return LogLevel::Off;
    case spdlog::level::critical:
      return LogLevel::Critical;
    case spdlog::level::err:
      return LogLevel::Error;
    case spdlog::level::warn:
      return LogLevel::Warning;
    case spdlog::level::info:
      return LogLevel::Info;
    case spdlog::level::debug:
      return LogLevel::Debug;
    case spdlog::level::trace:
      return LogLevel::Trace;
    default:
      throw std::invalid_argument("Invalid log level");
    }
  }

  static LogLevel get_default_level() {
    const auto level = read_int_from_env("CT2_VERBOSE", 0);

    if (level < -3 || level > 3)
      throw std::invalid_argument("Invalid log level " + std::to_string(level)
                                  + " (should be between -3 and 3)");

    return static_cast<LogLevel>(level);
  }

  void init_logger() {
    static std::once_flag initialized;
    std::call_once(initialized, []() {
      auto logger = spdlog::stderr_logger_mt("ctranslate2");
      logger->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%n] [thread %t] [%l] %v");
      spdlog::set_default_logger(logger);
      spdlog::set_level(to_spdlog_level(get_default_level()));
    });
  }

  void set_log_level(const LogLevel level) {
    init_logger();
    spdlog::set_level(to_spdlog_level(level));
  }

  LogLevel get_log_level() {
    init_logger();
    return to_ct2_level(spdlog::get_level());
  }

}