/*
- * Copyright 2004-present Facebook, Inc.
+ * Copyright 2017-present Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/
#include <folly/experimental/logging/LogLevel.h>
+#include <array>
#include <cctype>
#include <ostream>
namespace folly {
+namespace {
+struct NumberedLevelInfo {
+ LogLevel min;
+ LogLevel max;
+ StringPiece lowerPrefix;
+ StringPiece upperPrefix;
+};
+
+constexpr std::array<NumberedLevelInfo, 2> numberedLogLevels = {{
+ NumberedLevelInfo{LogLevel::DBG, LogLevel::DBG0, "dbg", "DBG"},
+ NumberedLevelInfo{LogLevel::INFO, LogLevel::INFO0, "info", "INFO"},
+}};
+} // namespace
+
LogLevel stringToLogLevel(StringPiece name) {
string lowerNameStr;
lowerNameStr.reserve(name.size());
return LogLevel::MAX_LEVEL;
}
- if (lowerName.startsWith("dbg")) {
- auto remainder = lowerName.subpiece(3);
+ for (const auto& info : numberedLogLevels) {
+ if (!lowerName.startsWith(info.lowerPrefix)) {
+ continue;
+ }
+ auto remainder = lowerName.subpiece(info.lowerPrefix.size());
auto level = folly::tryTo<int>(remainder).value_or(-1);
- if (level < 0 || level > 100) {
- throw std::range_error("invalid dbg logger level: " + name.str());
+ if (level < 0 ||
+ static_cast<unsigned int>(level) > (static_cast<uint32_t>(info.max) -
+ static_cast<uint32_t>(info.min))) {
+ throw std::range_error(to<string>(
+ "invalid ", info.lowerPrefix, " logger level: ", name.str()));
}
- return LogLevel::DBG0 - level;
+ return info.max - level;
}
// Try as an plain integer if all else fails
return "FATAL";
}
- if (static_cast<uint32_t>(level) <= static_cast<uint32_t>(LogLevel::DBG0) &&
- static_cast<uint32_t>(level) > static_cast<uint32_t>(LogLevel::DBG)) {
- auto num =
- static_cast<uint32_t>(LogLevel::DBG0) - static_cast<uint32_t>(level);
- return folly::to<string>("DBG", num);
+ for (const auto& info : numberedLogLevels) {
+ if (static_cast<uint32_t>(level) <= static_cast<uint32_t>(info.max) &&
+ static_cast<uint32_t>(level) > static_cast<uint32_t>(info.min)) {
+ auto num = static_cast<uint32_t>(info.max) - static_cast<uint32_t>(level);
+ return folly::to<string>(info.upperPrefix, num);
+ }
}
+
return folly::to<string>("LogLevel(", static_cast<uint32_t>(level), ")");
}