cpp-utilities/io/ansiescapecodes.cpp

199 lines
6.5 KiB
C++
Raw Permalink Normal View History

2015-09-06 20:19:09 +02:00
#include "./ansiescapecodes.h"
namespace CppUtilities {
2017-10-17 00:00:46 +02:00
/*!
* \brief Encapsulates functions for formatted terminal output using ANSI escape codes.
*/
namespace EscapeCodes {
2017-10-17 00:00:46 +02:00
/*!
* \brief Controls whether the functions inside the EscapeCodes namespace actually make use of escape codes.
*
* This allows to disable use of escape codes when not appropriate.
*
* The default value can be configured at build time by setting the CMake variable ENABLE_ESCAPE_CODES_BY_DEFAULT.
* The "default for the default" is true.
* However, the default is overridden with the value of the environment variable ENABLE_ESCAPE_CODES when instantiating
* a NoColorArgument (if ENABLE_ESCAPE_CODES is present).
2017-10-17 00:00:46 +02:00
*
* \sa NoColorArgument
2017-10-17 00:00:46 +02:00
*/
bool enabled =
#ifdef CPP_UTILITIES_ESCAPE_CODES_ENABLED_BY_DEFAULT
true
#else
false
#endif
;
/*!
2020-11-18 00:37:43 +01:00
* \brief Prints the specified \a phrase in a formatted manner using ANSI escape codes.
*/
std::ostream &operator<<(std::ostream &stream, Phrases phrase)
{
switch (phrase) {
case Phrases::Error:
setStyle(stream, Color::Red, ColorContext::Foreground, TextAttribute::Bold);
stream << "Error: ";
setStyle(stream, TextAttribute::Reset);
setStyle(stream, TextAttribute::Bold);
break;
case Phrases::Warning:
setStyle(stream, Color::Yellow, ColorContext::Foreground, TextAttribute::Bold);
stream << "Warning: ";
setStyle(stream, TextAttribute::Reset);
setStyle(stream, TextAttribute::Bold);
break;
case Phrases::End:
setStyle(stream, TextAttribute::Reset);
stream << '\n';
break;
case Phrases::PlainMessage:
stream << " ";
setStyle(stream, TextAttribute::Reset);
setStyle(stream, TextAttribute::Bold);
break;
case Phrases::SuccessMessage:
setStyle(stream, Color::Green, ColorContext::Foreground, TextAttribute::Bold);
stream << "==> ";
setStyle(stream, TextAttribute::Reset);
setStyle(stream, TextAttribute::Bold);
break;
case Phrases::SubMessage:
setStyle(stream, Color::Green, ColorContext::Foreground, TextAttribute::Bold);
stream << " -> ";
setStyle(stream, TextAttribute::Reset);
setStyle(stream, TextAttribute::Bold);
break;
case Phrases::ErrorMessage:
2018-01-29 16:26:28 +01:00
setStyle(stream, Color::Red, ColorContext::Foreground, TextAttribute::Bold);
stream << "==> ERROR: ";
setStyle(stream, TextAttribute::Reset);
setStyle(stream, TextAttribute::Bold);
break;
case Phrases::WarningMessage:
2018-01-29 16:26:28 +01:00
setStyle(stream, Color::Yellow, ColorContext::Foreground, TextAttribute::Bold);
stream << "==> WARNING: ";
setStyle(stream, TextAttribute::Reset);
setStyle(stream, TextAttribute::Bold);
break;
2017-10-09 20:36:18 +02:00
case Phrases::EndFlush:
setStyle(stream, TextAttribute::Reset);
stream << std::endl;
break;
2017-11-27 10:24:44 +01:00
case Phrases::Info:
setStyle(stream, Color::Blue, ColorContext::Foreground, TextAttribute::Bold);
stream << "Info: ";
setStyle(stream, TextAttribute::Reset);
setStyle(stream, TextAttribute::Bold);
break;
2018-04-01 23:08:31 +02:00
case Phrases::Override:
eraseLine(stream);
stream << '\r';
break;
case Phrases::SubError:
setStyle(stream, Color::Red, ColorContext::Foreground, TextAttribute::Bold);
stream << " -> ERROR: ";
setStyle(stream, TextAttribute::Reset);
setStyle(stream, TextAttribute::Bold);
break;
case Phrases::SubWarning:
setStyle(stream, Color::Yellow, ColorContext::Foreground, TextAttribute::Bold);
stream << " -> WARNING: ";
setStyle(stream, TextAttribute::Reset);
setStyle(stream, TextAttribute::Bold);
break;
2019-11-17 22:26:13 +01:00
case Phrases::InfoMessage:
setStyle(stream, Color::White, ColorContext::Foreground, TextAttribute::Bold);
stream << "==> ";
setStyle(stream, TextAttribute::Reset);
setStyle(stream, TextAttribute::Bold);
break;
}
return stream;
}
2020-11-18 00:37:43 +01:00
/*!
* \brief Returns a string for the specified \a phrase *without* formatting.
*/
std::string_view phraseString(Phrases phrase)
{
using namespace std::string_view_literals;
switch (phrase) {
case Phrases::Error:
return "Error: "sv;
case Phrases::Warning:
return "Warning: "sv;
case Phrases::PlainMessage:
return " "sv;
case Phrases::SuccessMessage:
return "==> "sv;
case Phrases::SubMessage:
return " -> "sv;
case Phrases::ErrorMessage:
return "==> ERROR: "sv;
case Phrases::WarningMessage:
return "==> WARNING: ";
case Phrases::Info:
return "Info: "sv;
case Phrases::SubError:
return " -> ERROR: "sv;
case Phrases::SubWarning:
return " -> WARNING: "sv;
case Phrases::InfoMessage:
return "==> "sv;
case Phrases::End:
case Phrases::EndFlush:
return "\n";
default:
return std::string_view{};
}
}
2020-11-18 00:37:43 +01:00
/*!
* \brief Returns a string for the specified \a phrase which is formatted using ANSI escape codes.
* \remarks This function is still experimental. It might be modified in an incompatible way or even removed
* in the next minor or patch release.
2020-11-18 00:37:43 +01:00
*/
std::string_view formattedPhraseString(Phrases phrase)
{
if (!enabled) {
return phraseString(phrase);
}
using namespace std::string_view_literals;
switch (phrase) {
case Phrases::Error:
return "\033[1;31mError: \033[0m\033[1m"sv;
2020-11-18 00:37:43 +01:00
case Phrases::Warning:
return "\033[1;33mWarning: \033[0m\033[1m"sv;
2020-11-18 00:37:43 +01:00
case Phrases::PlainMessage:
return " \033[0m\033[1m"sv;
2020-11-18 00:37:43 +01:00
case Phrases::SuccessMessage:
return "\033[1;32m==> \033[0m\033[1m"sv;
2020-11-18 00:37:43 +01:00
case Phrases::SubMessage:
return "\033[1;32m -> \033[0m\033[1m"sv;
2020-11-18 00:37:43 +01:00
case Phrases::ErrorMessage:
return "\033[1;31m==> ERROR: \033[0m\033[1m"sv;
2020-11-18 00:37:43 +01:00
case Phrases::WarningMessage:
return "\033[1;33m==> WARNING: \033[0m\033[1m";
2020-11-18 00:37:43 +01:00
case Phrases::Info:
return "\033[1;34mInfo: \033[0m\033[1m"sv;
2020-11-18 00:37:43 +01:00
case Phrases::SubError:
return "\033[1;31m -> ERROR: \033[0m\033[1m"sv;
2020-11-18 00:37:43 +01:00
case Phrases::SubWarning:
return "\033[1;33m -> WARNING: \033[0m\033[1m"sv;
2020-11-18 00:37:43 +01:00
case Phrases::InfoMessage:
return "\033[1;37m==> \033[0m\033[1m"sv;
2020-11-18 00:37:43 +01:00
case Phrases::End:
case Phrases::EndFlush:
return "\033[0m\n";
2020-11-18 00:37:43 +01:00
default:
return std::string_view{};
}
}
} // namespace EscapeCodes
} // namespace CppUtilities