Riyyi
2 years ago
4 changed files with 209 additions and 5 deletions
@ -0,0 +1,109 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 Riyyi |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <cstdio> // FILE |
||||||
|
#include <string> |
||||||
|
|
||||||
|
#include "util/format/color.h" |
||||||
|
#include "util/format/log.h" |
||||||
|
|
||||||
|
namespace Util::Format { |
||||||
|
|
||||||
|
std::string formatTimeElapsed() |
||||||
|
{ |
||||||
|
return format("{:.3}s ", s_timer.elapsedNanoseconds() / 1000000000.0); |
||||||
|
} |
||||||
|
|
||||||
|
std::string formatType(Type type) |
||||||
|
{ |
||||||
|
std::string output; |
||||||
|
|
||||||
|
formatTo(output, "["); |
||||||
|
switch (type) { |
||||||
|
case Type::Trace: |
||||||
|
formatTo(output, "trace"); |
||||||
|
break; |
||||||
|
case Type::Debug: |
||||||
|
formatTo(output, fg(TerminalColor::Magenta), "debug"); |
||||||
|
break; |
||||||
|
case Type::Success: |
||||||
|
formatTo(output, fg(TerminalColor::Green), "success"); |
||||||
|
break; |
||||||
|
case Type::Info: |
||||||
|
formatTo(output, fg(TerminalColor::Blue), "info"); |
||||||
|
break; |
||||||
|
case Type::Warn: |
||||||
|
formatTo(output, Emphasis::Bold | fg(TerminalColor::Yellow), "warn"); |
||||||
|
break; |
||||||
|
case Type::Error: |
||||||
|
formatTo(output, Emphasis::Bold | fg(TerminalColor::Red), "error"); |
||||||
|
break; |
||||||
|
case Type::Critical: |
||||||
|
formatTo(output, Emphasis::Bold | fg(TerminalColor::White) | bg(TerminalColor::Red), "critical"); |
||||||
|
break; |
||||||
|
default: |
||||||
|
break; |
||||||
|
}; |
||||||
|
formatTo(output, "] "); |
||||||
|
|
||||||
|
return output; |
||||||
|
} |
||||||
|
|
||||||
|
// -----------------------------------------
|
||||||
|
|
||||||
|
LogOperatorStyle::LogOperatorStyle(FILE* file, Type type) |
||||||
|
: m_file(file) |
||||||
|
, m_type(type) |
||||||
|
, m_stream() |
||||||
|
, m_builder(m_stream) |
||||||
|
{ |
||||||
|
m_stream << formatTimeElapsed(); |
||||||
|
m_stream << formatType(type); |
||||||
|
} |
||||||
|
|
||||||
|
LogOperatorStyle::~LogOperatorStyle() |
||||||
|
{ |
||||||
|
m_stream.write("\n", 1); |
||||||
|
std::string string = m_stream.str(); |
||||||
|
fputs(string.c_str(), m_file); |
||||||
|
} |
||||||
|
|
||||||
|
LogOperatorStyle trace() |
||||||
|
{ |
||||||
|
return LogOperatorStyle(stdout, Type::Trace); |
||||||
|
} |
||||||
|
|
||||||
|
LogOperatorStyle debug() |
||||||
|
{ |
||||||
|
return LogOperatorStyle(stdout, Type::Debug); |
||||||
|
} |
||||||
|
|
||||||
|
LogOperatorStyle success() |
||||||
|
{ |
||||||
|
return LogOperatorStyle(stdout, Type::Success); |
||||||
|
} |
||||||
|
|
||||||
|
LogOperatorStyle info() |
||||||
|
{ |
||||||
|
return LogOperatorStyle(stdout, Type::Info); |
||||||
|
} |
||||||
|
|
||||||
|
LogOperatorStyle warn() |
||||||
|
{ |
||||||
|
return LogOperatorStyle(stderr, Type::Warn); |
||||||
|
} |
||||||
|
|
||||||
|
LogOperatorStyle error() |
||||||
|
{ |
||||||
|
return LogOperatorStyle(stderr, Type::Error); |
||||||
|
} |
||||||
|
|
||||||
|
LogOperatorStyle critical() |
||||||
|
{ |
||||||
|
return LogOperatorStyle(stderr, Type::Critical); |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace Util::Format
|
@ -0,0 +1,97 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 Riyyi |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <cstdio> // FILE, stderr, stdout |
||||||
|
#include <string> |
||||||
|
#include <string_view> |
||||||
|
|
||||||
|
#include "util/format/format.h" |
||||||
|
#include "util/format/print.h" |
||||||
|
#include "util/timer.h" |
||||||
|
|
||||||
|
namespace Util::Format { |
||||||
|
|
||||||
|
static Util::Timer s_timer; |
||||||
|
|
||||||
|
enum class Type : uint8_t { |
||||||
|
Trace, // White
|
||||||
|
Debug, // Purple
|
||||||
|
Success, // Green
|
||||||
|
Info, // Blue
|
||||||
|
Warn, // Bold yellow
|
||||||
|
Error, // Bold red
|
||||||
|
Critical, // Bold on red
|
||||||
|
}; |
||||||
|
|
||||||
|
std::string formatTimeElapsed(); |
||||||
|
std::string formatType(Type type); |
||||||
|
|
||||||
|
#define LOG_FUNCTION(name, file, type) \ |
||||||
|
template<size_t N, typename... Parameters> \
|
||||||
|
void name(const char(&format)[N], const Parameters&... parameters) \
|
||||||
|
{ \
|
||||||
|
print(file, "{}", formatTimeElapsed()); \
|
||||||
|
print(file, "{}", formatType(type)); \
|
||||||
|
VariadicParameters variadicParameters { parameters... }; \
|
||||||
|
print(file, format, variadicParameters); \
|
||||||
|
print(file, "\n"); \
|
||||||
|
} |
||||||
|
|
||||||
|
LOG_FUNCTION(trace, stdout, Type::Trace); |
||||||
|
LOG_FUNCTION(debug, stdout, Type::Debug); |
||||||
|
LOG_FUNCTION(success, stdout, Type::Success); |
||||||
|
LOG_FUNCTION(info, stdout, Type::Info); |
||||||
|
LOG_FUNCTION(warn, stderr, Type::Warn); |
||||||
|
LOG_FUNCTION(error, stderr, Type::Error); |
||||||
|
LOG_FUNCTION(critical, stderr, Type::Critical); |
||||||
|
|
||||||
|
// -----------------------------------------
|
||||||
|
|
||||||
|
class LogOperatorStyle { |
||||||
|
public: |
||||||
|
LogOperatorStyle(FILE* file, Type type); |
||||||
|
virtual ~LogOperatorStyle(); |
||||||
|
|
||||||
|
Builder& builder() { return m_builder; } |
||||||
|
|
||||||
|
private: |
||||||
|
FILE* m_file; |
||||||
|
Type m_type; |
||||||
|
|
||||||
|
std::stringstream m_stream; |
||||||
|
Builder m_builder; |
||||||
|
}; |
||||||
|
|
||||||
|
template<typename T> |
||||||
|
const LogOperatorStyle& operator<<(const LogOperatorStyle& logOperatorStyle, const T& value) |
||||||
|
{ |
||||||
|
_format(const_cast<LogOperatorStyle&>(logOperatorStyle).builder(), value); |
||||||
|
return logOperatorStyle; |
||||||
|
} |
||||||
|
|
||||||
|
LogOperatorStyle trace(); |
||||||
|
LogOperatorStyle debug(); |
||||||
|
LogOperatorStyle success(); |
||||||
|
LogOperatorStyle info(); |
||||||
|
LogOperatorStyle warn(); |
||||||
|
LogOperatorStyle error(); |
||||||
|
LogOperatorStyle critical(); |
||||||
|
|
||||||
|
} // namespace Util::Format
|
||||||
|
|
||||||
|
namespace Util { |
||||||
|
|
||||||
|
using Util::Format::critical; |
||||||
|
using Util::Format::debug; |
||||||
|
using Util::Format::error; |
||||||
|
using Util::Format::info; |
||||||
|
using Util::Format::success; |
||||||
|
using Util::Format::trace; |
||||||
|
using Util::Format::warn; |
||||||
|
|
||||||
|
} // namespace Util
|
Loading…
Reference in new issue