diff --git a/app/main.cpp b/app/main.cpp index 61054b1..6afd9e5 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -16,7 +16,8 @@ int main(int argc, char **argv) ("help,h", "Display this help message") ("version,v", "Display version information") ("input,i", po::value>(), "Input files") - ("color", po::value()->default_value("auto"), "Whether to colorize the output (always, never, or auto)."); + ("color,c", po::value()->default_value("auto"), "Colorize the output (always, never, or auto).") + ("log-priority,p", po::value()->default_value("warning"), "Log messages starting from this priority (debug, info, warning, or error)."); po::positional_options_description positionalOptionsDescription; positionalOptionsDescription.add("input", -1); @@ -60,17 +61,32 @@ int main(int argc, char **argv) return EXIT_SUCCESS; } - const auto colorPolicy = variablesMap["color"].as(); + const auto colorPolicyString = variablesMap["color"].as(); - if (colorPolicy == "auto") + if (colorPolicyString == "auto") context.logger.setColorPolicy(anthem::output::ColorStream::ColorPolicy::Auto); - else if (colorPolicy == "never") + else if (colorPolicyString == "never") context.logger.setColorPolicy(anthem::output::ColorStream::ColorPolicy::Never); - else if (colorPolicy == "always") + else if (colorPolicyString == "always") context.logger.setColorPolicy(anthem::output::ColorStream::ColorPolicy::Always); else { - context.logger.log(anthem::output::Priority::Error, ("unknown color policy “" + colorPolicy + "”").c_str()); + context.logger.log(anthem::output::Priority::Error, ("unknown color policy “" + colorPolicyString + "”").c_str()); + context.logger.errorStream() << std::endl; + printHelp(); + return EXIT_FAILURE; + } + + const auto logPriorityString = variablesMap["log-priority"].as(); + + try + { + const auto logPriority = anthem::output::priorityFromName(logPriorityString.c_str()); + context.logger.setLogPriority(logPriority); + } + catch (const std::exception &e) + { + context.logger.log(anthem::output::Priority::Error, ("unknown log priorty “" + logPriorityString + "”").c_str()); context.logger.errorStream() << std::endl; printHelp(); return EXIT_FAILURE; diff --git a/include/anthem/output/Logger.h b/include/anthem/output/Logger.h index 747cb25..b18a140 100644 --- a/include/anthem/output/Logger.h +++ b/include/anthem/output/Logger.h @@ -29,7 +29,7 @@ class Logger ColorStream &errorStream(); // The level from which on messages should be printed - void setOutputPriority(Priority outputLevel); + void setLogPriority(Priority logPriority); void setColorPolicy(ColorStream::ColorPolicy colorPolicy); void log(Priority priority, const char *message); @@ -39,7 +39,7 @@ class Logger ColorStream m_outputStream; ColorStream m_errorStream; - Priority m_outputPriority; + Priority m_logPriority; }; //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/anthem/output/Priority.h b/include/anthem/output/Priority.h index 9a2ff40..9be71d5 100644 --- a/include/anthem/output/Priority.h +++ b/include/anthem/output/Priority.h @@ -1,6 +1,9 @@ #ifndef __ANTHEM__OUTPUT__PRIORITY_H #define __ANTHEM__OUTPUT__PRIORITY_H +#include +#include + namespace anthem { namespace output @@ -22,6 +25,41 @@ enum class Priority //////////////////////////////////////////////////////////////////////////////////////////////////// +inline constexpr const char *priorityName(Priority priority) +{ + switch (priority) + { + case Priority::Debug: + return "debug"; + case Priority::Info: + return "info"; + case Priority::Warning: + return "warning"; + case Priority::Error: + return "error"; + } + + return "unknown"; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +inline Priority priorityFromName(const char *priorityName) +{ + if (std::strcmp(priorityName, "debug") == 0) + return Priority::Debug; + if (std::strcmp(priorityName, "info") == 0) + return Priority::Info; + if (std::strcmp(priorityName, "warning") == 0) + return Priority::Warning; + if (std::strcmp(priorityName, "error") == 0) + return Priority::Error; + + throw std::runtime_error("unknown log priority"); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// + } } diff --git a/src/anthem/output/Logger.cpp b/src/anthem/output/Logger.cpp index 0b4ae1e..1332ab7 100644 --- a/src/anthem/output/Logger.cpp +++ b/src/anthem/output/Logger.cpp @@ -20,7 +20,7 @@ constexpr Format priorityFormat(Priority priority) case Priority::Debug: return {Color::Green, FontWeight::Bold}; case Priority::Info: - return {Color::Cyan, FontWeight::Bold}; + return {Color::Blue, FontWeight::Bold}; case Priority::Warning: return {Color::Magenta, FontWeight::Bold}; case Priority::Error: @@ -32,25 +32,6 @@ constexpr Format priorityFormat(Priority priority) //////////////////////////////////////////////////////////////////////////////////////////////////// -constexpr const char *priorityName(Priority priority) -{ - switch (priority) - { - case Priority::Debug: - return "debug"; - case Priority::Info: - return "info"; - case Priority::Warning: - return "warning"; - case Priority::Error: - return "error"; - } - - return "message"; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - constexpr const Format MessageBodyFormat = {Color::White, FontWeight::Bold}; //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -76,7 +57,7 @@ Logger::Logger(ColorStream &&outputStream) Logger::Logger(ColorStream &&outputStream, ColorStream &&errorStream) : m_outputStream{outputStream}, m_errorStream{errorStream}, - m_outputPriority{Priority::Warning} + m_logPriority{Priority::Warning} { } @@ -96,9 +77,9 @@ ColorStream &Logger::errorStream() //////////////////////////////////////////////////////////////////////////////////////////////////// -void Logger::setOutputPriority(Priority outputPriority) +void Logger::setLogPriority(Priority logPriority) { - m_outputPriority = outputPriority; + m_logPriority = logPriority; } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -115,7 +96,7 @@ void Logger::log(Priority priority, const char *message) { const auto priorityID = static_cast(priority); - if (priorityID < static_cast(m_outputPriority)) + if (priorityID < static_cast(m_logPriority)) return; m_outputStream @@ -131,7 +112,7 @@ void Logger::log(Priority priority, const input::Location &location, const char { const auto priorityID = static_cast(priority); - if (priorityID < static_cast(m_outputPriority)) + if (priorityID < static_cast(m_logPriority)) return; auto &stream =