feat: add log library
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <format>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
namespace seallib
|
||||
{
|
||||
enum class LogType
|
||||
{
|
||||
VERBOSE,
|
||||
INFO,
|
||||
WARNING,
|
||||
ERROR
|
||||
};
|
||||
|
||||
inline constexpr std::string_view logTypeNames[]{"VERBOSE", "INFO", "WARNING", "ERROR"};
|
||||
inline constexpr std::string_view logTypeColors[]{"\x1b[34;40m", "\x1b[32;40m", "\x1b[30;43m", "\x1b[97;41m"};
|
||||
|
||||
inline constexpr std::string_view getLogTypeName(LogType type)
|
||||
{
|
||||
return logTypeNames[static_cast<size_t>(type)];
|
||||
}
|
||||
|
||||
inline constexpr std::string_view getLogTypeColor(LogType type)
|
||||
{
|
||||
return logTypeColors[static_cast<size_t>(type)];
|
||||
}
|
||||
|
||||
/*
|
||||
log sink for subscriptions
|
||||
*/
|
||||
class ILogSink
|
||||
{
|
||||
public:
|
||||
virtual ~ILogSink() = default;
|
||||
virtual void receiveLog(LogType type, std::string_view loggerName, std::string_view message) = 0;
|
||||
};
|
||||
|
||||
/*
|
||||
logger class
|
||||
*/
|
||||
class Logger
|
||||
{
|
||||
public:
|
||||
explicit Logger(std::string_view name) : _name(name) {}
|
||||
|
||||
template <typename... Args> void verbose(std::format_string<Args...> fmt, Args&&... args)
|
||||
{
|
||||
write(LogType::VERBOSE, std::vformat(fmt.get(), std::make_format_args(args...)));
|
||||
}
|
||||
|
||||
template <typename... Args> void info(std::format_string<Args...> fmt, Args&&... args)
|
||||
{
|
||||
write(LogType::INFO, std::vformat(fmt.get(), std::make_format_args(args...)));
|
||||
}
|
||||
|
||||
template <typename... Args> void warning(std::format_string<Args...> fmt, Args&&... args)
|
||||
{
|
||||
write(LogType::WARNING, std::vformat(fmt.get(), std::make_format_args(args...)));
|
||||
}
|
||||
|
||||
template <typename... Args> void error(std::format_string<Args...> fmt, Args&&... args)
|
||||
{
|
||||
write(LogType::ERROR, std::vformat(fmt.get(), std::make_format_args(args...)));
|
||||
}
|
||||
|
||||
[[nodiscard]] std::string_view getName() const { return _name; }
|
||||
void addSink(std::shared_ptr<ILogSink> sink) { _sinks.push_back(std::move(sink)); }
|
||||
|
||||
protected:
|
||||
void write(LogType type, const std::string& message)
|
||||
{
|
||||
for (auto& sink : _sinks)
|
||||
sink->receiveLog(type, _name, message);
|
||||
}
|
||||
|
||||
private:
|
||||
std::string _name;
|
||||
std::vector<std::shared_ptr<ILogSink>> _sinks;
|
||||
};
|
||||
} // namespace seallib
|
||||
Reference in New Issue
Block a user