qxLib
base_standard_streams_stream.inl
Go to the documentation of this file.
1 /**
2 
3  @file base_standard_streams_stream.inl
4  @author Khrapov
5  @date 18.01.2026
6  @copyright © Nick Khrapov, 2026. All right reserved.
7 
8 **/
9 
10 namespace qx
11 {
12 
14  : base_logger_stream(streamConfig)
15  , m_bUsingColors(streamConfig.bUseColors)
16  , m_bSyncUsualAndErrorMessages(streamConfig.bSyncUsualAndErrorMessages)
17 {
18 }
19 
20 inline void base_standard_streams_stream::do_log(const category& category, verbosity eVerbosity, string_view svMessage)
21 {
22  if (m_bUsingColors)
23  {
24  color lineColor = color::white();
25  switch (eVerbosity)
26  {
27  case verbosity::detailed:
28  case verbosity::verbose:
29  lineColor = color::gray();
30  break;
31 
32  case verbosity::log:
33  lineColor = color::white();
34  break;
35 
36  case verbosity::important:
37  lineColor = color::khaki();
38  break;
39 
40  case verbosity::warning:
41  lineColor = color::orange();
42  break;
43 
44  case verbosity::error:
45  lineColor = color::crimson();
46  break;
47 
48  case verbosity::critical:
49  lineColor = color::dark_red();
50  break;
51  }
52 
53  struct logger_color_range
54  {
55  std::pair<size_t, size_t> range { 0, 0 };
56  color rangeColor = color::white();
57  };
58 
59  // currently only one color range (category name) is supported
60  // loop is left, so it can be extended later if needed
61  std::array<logger_color_range, 1> colors;
62  size_t colorsCount = 0;
63 
64  if (auto nPos = svMessage.find(category.get_name()); nPos != string::npos)
65  {
66  colors[0] = { .range = { nPos, nPos + category.get_name().size() }, .rangeColor = category.get_color() };
67  colorsCount = 1;
68  }
69 
70  cout_colorized(
71  eVerbosity,
72  string_view(svMessage.data(), colorsCount == 0 ? svMessage.size() : colors.front().range.first),
73  lineColor);
74 
75  for (size_t i = 0; i < colorsCount; ++i)
76  {
77  cout_colorized(
78  eVerbosity,
79  string_view(svMessage.data() + colors[i].range.first, colors[i].range.second - colors[i].range.first),
80  colors[i].rangeColor);
81  cout_colorized(
82  eVerbosity,
83  string_view(
84  svMessage.data() + colors[i].range.second,
85  (i + 1 < colorsCount ? colors[i + 1].range.first : svMessage.size()) - colors[i].range.second),
86  lineColor);
87  }
88  }
89  else
90  {
91  cout_common(eVerbosity, svMessage);
92  }
93 }
94 
95 inline void base_standard_streams_stream::check_previous_message(verbosity eCurrentMessageVerbosity)
96 {
97  if (m_bSyncUsualAndErrorMessages)
98  {
99  const bool bCurrentMessageIsError = is_error(eCurrentMessageVerbosity);
100 
101  if (bCurrentMessageIsError != m_bPrevMessageWasError)
102  flush();
103 
104  m_bPrevMessageWasError = bCurrentMessageIsError;
105  }
106 }
107 
108 } // namespace qx
Base class for logger streams.
void flush()
Flush the stream.
void check_previous_message(verbosity eCurrentMessageVerbosity)
Check the previous message type and flush if needed.
base_standard_streams_stream(const config &streamConfig) noexcept
base_standard_streams_stream object constructor
virtual void do_log(const category &category, verbosity eVerbosity, string_view svMessage) override
Proceed stream logging.
A category is a class that identifies a particular piece of code. This code can be located in differe...
Definition: category.h:59
constexpr string_view get_name() const noexcept
Get category name.
Definition: category.inl:26
constexpr const color & get_color() const noexcept
Get category color.
Definition: category.inl:31
RGBA color.
Definition: color.h:193
bool is_error(verbosity eVerbosity) noexcept
Check if the verbosity level is an error.
Definition: verbosity.h:35