diff --git a/loader/include/Geode/loader/Log.hpp b/loader/include/Geode/loader/Log.hpp index b3c255bd..817dd47b 100644 --- a/loader/include/Geode/loader/Log.hpp +++ b/loader/include/Geode/loader/Log.hpp @@ -154,6 +154,7 @@ namespace geode { bool operator==(Log const& l); std::string toString(bool logTime = true) const; + std::string toString(bool logTime, uint32_t nestLevel) const; std::vector& getComponents(); log_clock::time_point getTime() const; @@ -170,6 +171,7 @@ namespace geode { private: static std::vector& logs(); static std::ofstream& logStream(); + static uint32_t& nestLevel(); Logger() = delete; ~Logger() = delete; @@ -179,9 +181,11 @@ namespace geode { static void setup(); static void push(Log&& log); - static void pop(Log* log); + static void pushNest(); + static void popNest(); + static std::vector list(); static void clear(); }; @@ -223,5 +227,12 @@ namespace geode { void error(Args... args) { internalLog(Severity::Error, getMod(), args...); } + + static void pushNest() { + Logger::pushNest(); + } + static void popNest() { + Logger::popNest(); + } } } diff --git a/loader/src/loader/Log.cpp b/loader/src/loader/Log.cpp index 42e735ae..ec69eed7 100644 --- a/loader/src/loader/Log.cpp +++ b/loader/src/loader/Log.cpp @@ -104,6 +104,9 @@ bool Log::operator==(Log const& l) { } std::string Log::toString(bool logTime) const { + return toString(logTime, 0); +} +std::string Log::toString(bool logTime, uint32_t nestLevel) const { std::string res; if (logTime) { @@ -112,6 +115,10 @@ std::string Log::toString(bool logTime) const { res += fmt::format(" [{}]: ", m_sender ? m_sender->getName() : "Geode?"); + for (uint32_t i = 0; i < nestLevel; i++) { + res += " "; + } + for (auto& i : m_components) { res += i->_toString(); } @@ -205,13 +212,17 @@ std::ofstream& Logger::logStream() { static std::ofstream logStream; return logStream; } +uint32_t& Logger::nestLevel() { + static std::uint32_t nestLevel = 0; + return nestLevel; +} void Logger::setup() { logStream() = std::ofstream(dirs::getGeodeLogDir() / log::generateLogName()); } void Logger::push(Log&& log) { - std::string logStr = log.toString(true); + std::string logStr = log.toString(true, nestLevel()); LoaderImpl::get()->logConsoleMessageWithSeverity(logStr, log.getSeverity()); logStream() << logStr << std::endl; @@ -223,6 +234,17 @@ void Logger::pop(Log* log) { geode::utils::ranges::remove(Logger::logs(), *log); } +void Logger::pushNest() { + if (nestLevel() == std::numeric_limits::max()) + return; + nestLevel()++; +} +void Logger::popNest() { + if (nestLevel() == 0) + return; + nestLevel()--; +} + std::vector Logger::list() { std::vector logs_; logs_.reserve(logs().size());