Logger System 0.1.3
High-performance C++20 thread-safe logging system with asynchronous capabilities
Loading...
Searching...
No Matches
string_utils.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
11#pragma once
12
13#include <string>
14#include <sstream>
15#include <iomanip>
16
17// Use common_system's standard interface
18#include <kcenon/common/interfaces/logger_interface.h>
19
20namespace kcenon::logger::utils {
21
22// Type alias for log_level
23using log_level = common::interfaces::log_level;
24
32public:
42 static std::string level_to_string(log_level level) {
43 switch (level) {
44 case log_level::critical: return "CRITICAL";
45 case log_level::error: return "ERROR";
46 case log_level::warning: return "WARNING";
47 case log_level::info: return "INFO";
48 case log_level::debug: return "DEBUG";
49 case log_level::trace: return "TRACE";
50 case log_level::off: return "OFF";
51 }
52 return "UNKNOWN";
53 }
54
72 static std::string level_to_color(log_level level, bool use_colors = true) {
73 if (!use_colors) {
74 return "";
75 }
76
77 switch (level) {
78 case log_level::critical: return "\033[1;35m"; // Bright Magenta
79 case log_level::error: return "\033[1;31m"; // Bright Red
80 case log_level::warning: return "\033[1;33m"; // Bright Yellow
81 case log_level::info: return "\033[1;32m"; // Bright Green
82 case log_level::debug: return "\033[1;36m"; // Bright Cyan
83 case log_level::trace: return "\033[37m"; // White
84 case log_level::off: return "\033[90m"; // Dark Gray
85 }
86 return "";
87 }
88
95 static const char* color_reset() {
96 return "\033[0m";
97 }
98
114 static std::string escape_json(const std::string& str) {
115 std::ostringstream oss;
116 for (char c : str) {
117 switch (c) {
118 case '"': oss << "\\\""; break;
119 case '\\': oss << "\\\\"; break;
120 case '/': oss << "\\/"; break;
121 case '\b': oss << "\\b"; break;
122 case '\f': oss << "\\f"; break;
123 case '\n': oss << "\\n"; break;
124 case '\r': oss << "\\r"; break;
125 case '\t': oss << "\\t"; break;
126 default:
127 // Handle control characters
128 if (c >= 0 && c < 0x20) {
129 oss << "\\u"
130 << std::hex << std::setw(4) << std::setfill('0')
131 << static_cast<int>(c);
132 } else {
133 oss << c;
134 }
135 break;
136 }
137 }
138 return oss.str();
139 }
140
155 static std::string escape_xml(const std::string& str) {
156 std::ostringstream oss;
157 for (char c : str) {
158 switch (c) {
159 case '&': oss << "&amp;"; break;
160 case '<': oss << "&lt;"; break;
161 case '>': oss << "&gt;"; break;
162 case '"': oss << "&quot;"; break;
163 case '\'': oss << "&apos;"; break;
164 default: oss << c; break;
165 }
166 }
167 return oss.str();
168 }
169
183 static std::string extract_filename(const std::string& file_path) {
184 if (file_path.empty()) {
185 return file_path;
186 }
187
188 size_t pos = file_path.find_last_of("/\\");
189 if (pos != std::string::npos) {
190 return file_path.substr(pos + 1);
191 }
192
193 return file_path;
194 }
195
204 static std::string trim(const std::string& str) {
205 const char* whitespace = " \t\n\r\f\v";
206
207 size_t start = str.find_first_not_of(whitespace);
208 if (start == std::string::npos) {
209 return ""; // String is all whitespace
210 }
211
212 size_t end = str.find_last_not_of(whitespace);
213 return str.substr(start, end - start + 1);
214 }
215
224 static std::string to_lower(const std::string& str) {
225 std::string result = str;
226 for (char& c : result) {
227 if (c >= 'A' && c <= 'Z') {
228 c = c + ('a' - 'A');
229 }
230 }
231 return result;
232 }
233
242 static std::string to_upper(const std::string& str) {
243 std::string result = str;
244 for (char& c : result) {
245 if (c >= 'a' && c <= 'z') {
246 c = c - ('a' - 'A');
247 }
248 }
249 return result;
250 }
251
262 static std::string replace_all(
263 const std::string& str,
264 const std::string& from,
265 const std::string& to
266 ) {
267 if (from.empty()) {
268 return str;
269 }
270
271 std::string result = str;
272 size_t pos = 0;
273
274 while ((pos = result.find(from, pos)) != std::string::npos) {
275 result.replace(pos, from.length(), to);
276 pos += to.length();
277 }
278
279 return result;
280 }
281};
282
283} // namespace kcenon::logger::utils
String utility functions for log formatting and conversion.
static std::string level_to_color(log_level level, bool use_colors=true)
Convert log level to ANSI color code.
static std::string level_to_string(log_level level)
Convert log level to human-readable string.
static const char * color_reset()
ANSI color reset sequence.
static std::string escape_json(const std::string &str)
Escape special characters for JSON.
static std::string trim(const std::string &str)
Trim whitespace from both ends of string.
static std::string replace_all(const std::string &str, const std::string &from, const std::string &to)
Replace all occurrences of a substring.
static std::string to_upper(const std::string &str)
Convert string to uppercase.
static std::string to_lower(const std::string &str)
Convert string to lowercase.
static std::string escape_xml(const std::string &str)
Escape special characters for XML.
static std::string extract_filename(const std::string &file_path)
Extract filename from full file path.
common::interfaces::log_level log_level