16 constexpr std::optional<logger_specifiers> get_log_specifier(string_view svName) noexcept
18 if (svName == QXT(
"c"))
19 return logger_specifiers::category;
21 if (svName == QXT(
"v"))
22 return logger_specifiers::verbosity;
24 if (svName == QXT(
"ti"))
25 return logger_specifiers::thread_id;
27 if (svName == QXT(
"t"))
28 return logger_specifiers::time;
30 if (svName == QXT(
"file"))
31 return logger_specifiers::file;
33 if (svName == QXT(
"func"))
34 return logger_specifiers::function;
36 if (svName == QXT(
"l"))
37 return logger_specifiers::line;
39 if (svName == QXT(
"m"))
40 return logger_specifiers::message;
47 template<
class char_t,
class traits_t>
50 char_type*
const pData = sPattern.data();
51 const size_t nSize = sPattern.size();
59 const char_type ch = pData[nRead];
66 if (nDepth == 0 && nRead + 1 < nSize && pData[nRead + 1] == QXT(
'{'))
68 pData[nWrite++] = QXT(
'{');
69 pData[nWrite++] = QXT(
'{');
75 pData[nWrite++] = QXT(
'{');
79 const size_t nNameBegin = nRead;
88 while (nRead < nSize && pData[nRead] != QXT(
':') && pData[nRead] != QXT(
'}') && pData[nRead] != QXT(
'{'))
94 return compile_pattern_result::unclosed_field;
97 if (pData[nRead] == QXT(
'{'))
98 return compile_pattern_result::invalid_field;
100 const string_view svName { pData + nNameBegin, nRead - nNameBegin };
102 if (
const auto eSpecifier = details::get_log_specifier(svName))
104 const auto nSpecifier =
static_cast<size_t>(*eSpecifier);
106 pData[nWrite++] =
static_cast<char_type
>(QXT(
'0') + nSpecifier);
115 bool bNumeric = svName.empty();
121 for (
const char_type chName : svName)
123 if (chName < QXT(
'0') || chName > QXT(
'9'))
132 return compile_pattern_result::unknown_specifier;
134 for (
const char_type chName : svName)
135 pData[nWrite++] = chName;
147 pData[nWrite++] = ch;
154 if (nRead + 1 < nSize && pData[nRead + 1] == QXT(
'}'))
156 pData[nWrite++] = QXT(
'}');
157 pData[nWrite++] = QXT(
'}');
163 return compile_pattern_result::unmatched_closing_brace;
166 pData[nWrite++] = ch;
171 return compile_pattern_result::unclosed_field;
173 sPattern.resize(nWrite);
175 return compile_pattern_result::ok;
180 string_view svPattern,
182 verbosity eVerbosity,
183 std::thread::id threadId,
184 std::chrono::system_clock::time_point messageTime,
186 string_view svFunction,
188 string_view svMessage)
196 std::chrono::floor<std::chrono::seconds>(messageTime),
requires format_acceptable_args_c< char_t, args_t... > void vformat(string_view svFormat, args_t &&... args)
Clear the string and format it with the format string and the args.
A category is a class that identifies a particular piece of code. This code can be located in differe...
void format_log_specifiers(string &sStorage, string_view svPattern, const category &category, verbosity eVerbosity, std::thread::id threadId, std::chrono::system_clock::time_point messageTime, string_view svFile, string_view svFunction, int nLine, string_view svMessage)
Format sStorage using qx::logger_specifiers.
compile_pattern_result compile_pattern(basic_string< char_t, traits_t > &sPattern) noexcept
Compile an fmt pattern with named arguments into replacement fields.