summaryrefslogtreecommitdiff
path: root/AK/LogStream.h
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-07-15 20:22:30 +0200
committerAndreas Kling <awesomekling@gmail.com>2019-07-15 20:22:30 +0200
commit8075ba50640f8b4657be03e4e8ff53de90645c62 (patch)
tree106bbe6892f8b82d2e0fe3dbeeba73407a350ff1 /AK/LogStream.h
parent82d9410226fcc0dc0c4f3867734b2b25c3f96679 (diff)
downloadserenity-8075ba50640f8b4657be03e4e8ff53de90645c62.zip
LogStream: Add a simple-ish mechanism for colorizing and styling output.
Meet TStyle. It allows you to write things like this: dbg() << TStyle(TStyle::Red, TStyle::Bold) << "Hello, friends!"; Any style used will be reset along with the newline emitted when the dbg() temporary goes out of scope. :^) This can definitely be improved, but I think it's a decent place to start.
Diffstat (limited to 'AK/LogStream.h')
-rw-r--r--AK/LogStream.h57
1 files changed, 56 insertions, 1 deletions
diff --git a/AK/LogStream.h b/AK/LogStream.h
index 44ee51df09..e5906a776f 100644
--- a/AK/LogStream.h
+++ b/AK/LogStream.h
@@ -7,12 +7,63 @@ namespace AK {
class String;
class StringView;
+class TStyle {
+public:
+ enum NoneTag { DummyValue };
+ static NoneTag None;
+
+ enum Color {
+ Black = 0,
+ Red,
+ Green,
+ Brown,
+ Blue,
+ Magenta,
+ Cyan,
+ LightGray,
+ DarkGray,
+ BrightRed,
+ BrightGreen,
+ Yellow,
+ BrightBlue,
+ BrightMagenta,
+ BrightCyan,
+ White,
+ NoColor = 255,
+ };
+ enum Attribute {
+ NoAttribute = 0,
+ Bold = 1,
+ };
+
+ TStyle() {}
+ TStyle(NoneTag) {}
+ TStyle(Color color, unsigned attributes = NoAttribute)
+ : m_color(color)
+ , m_attributes(attributes)
+ {
+ }
+
+ ~TStyle() {}
+
+ Color color() const { return m_color; }
+ unsigned attributes() const { return m_attributes; }
+
+private:
+ Color m_color { NoColor };
+ unsigned m_attributes { NoAttribute };
+};
+
class LogStream {
public:
LogStream() {}
virtual ~LogStream() {}
virtual void write(const char*, int) const = 0;
+
+protected:
+ friend const LogStream& operator<<(const LogStream&, const TStyle&);
+ mutable bool m_needs_style_reset { false };
};
class DebugLogStream final : public LogStream {
@@ -20,6 +71,8 @@ public:
DebugLogStream() {}
virtual ~DebugLogStream() override
{
+ if (m_needs_style_reset)
+ write("\033[0m", 4);
char newline = '\n';
write(&newline, 1);
}
@@ -51,6 +104,7 @@ const LogStream& operator<<(const LogStream&, const StringView&);
const LogStream& operator<<(const LogStream&, int);
const LogStream& operator<<(const LogStream&, unsigned);
const LogStream& operator<<(const LogStream&, const void*);
+const LogStream& operator<<(const LogStream& stream, const TStyle&);
inline const LogStream& operator<<(const LogStream& stream, char value)
{
@@ -65,5 +119,6 @@ inline const LogStream& operator<<(const LogStream& stream, bool value)
}
-using AK::LogStream;
using AK::dbg;
+using AK::LogStream;
+using AK::TStyle;