switch to {} style formatting for logs

This commit is contained in:
matcool 2022-10-08 15:35:19 -03:00
parent 0c19e0c75d
commit c5538da709
No known key found for this signature in database
GPG key ID: BF58756086D7AB1C
11 changed files with 109 additions and 46 deletions

View file

@ -36,7 +36,8 @@ namespace geode {
virtual std::string _toString() = 0;
};
template <typename T> requires requires(T b) { std::stringstream() << b; }
template <typename T>
requires requires(T b) { std::stringstream() << b; }
std::string parse(T const& thing) {
std::stringstream buf;
buf << thing;
@ -95,12 +96,19 @@ namespace geode {
friend void GEODE_DLL releaseSchedules(Mod* m);
};
template <typename ...Args> requires requires(Args... b) { (parse(b), ...); }
void log(Severity sev, Mod* m, Args... args) {
Log l(m, sev);
(l.getComponents().push_back(new ComponentBase(args)), ...);
void GEODE_DLL vlogImplSecretDontUse(Severity, Mod*, std::string_view, std::function<void(Log&)>*, size_t);
l.pushToLoader();
template <typename... Args>
requires requires(Args... b) { (parse(b), ...); }
void log(Severity severity, Mod* mod, std::string_view formatStr, Args... args) {
static constexpr auto pushSomething = [](Log& log, auto something) {
// i think this line of code is very sad
log.getComponents().push_back(new ComponentBase(something));
};
std::array<std::function<void(Log&)>, sizeof...(Args)> comps = { [&](Log& log) { pushSomething(log, args); }... };
// tfw no std::span
vlogImplSecretDontUse(severity, mod, formatStr, comps.data(), comps.size());
}
void GEODE_DLL releaseSchedules(Mod* m);

View file

@ -356,7 +356,8 @@ namespace geode {
void checkUnknownKeys() {
for (auto& [key, _] : self().m_json.items()) {
if (!m_knownKeys.count(key)) {
log::debug(self().m_hierarchy + " contains unknown key \"" + key + "\"");
// log::debug(self().m_hierarchy + " contains unknown key \"" + key + "\"");
log::debug("{} contains unknown key \"{}\"", self().m_hierarchy, key);
}
}
}

View file

@ -87,7 +87,8 @@ namespace geode::addresser {
auto index = indexOf(func);
auto thunk = thunkOf(func);
log::debug("[[" + utils::intToHex((void*)ins) + " + " + utils::intToHex(thunk) + "] + " + utils::intToHex(index) + "]");
// log::debug("[[" + utils::intToHex((void*)ins) + " + " + utils::intToHex(thunk) + "] + " + utils::intToHex(index) + "]");
log::debug("[[{} + {}] + {}]", utils::intToHex((void*)ins), utils::intToHex(thunk), utils::intToHex(index));
// [[this + thunk] + offset] is the f we want
auto address = *(intptr_t*)(*(intptr_t*)(reference_cast<intptr_t>(ins) + thunk) + index);
@ -166,17 +167,17 @@ namespace geode::addresser {
#else
template<typename T>
inline intptr_t getVirtual(T func) {
log::debug("Get virtual function address from " + utils::intToHex(geode::cast::reference_cast<intptr_t>(func)));
log::debug("Get virtual function address from {}", utils::intToHex(geode::cast::reference_cast<intptr_t>(func)));
auto addr = Addresser::addressOfVirtual(func);
log::debug("The address is: " + utils::intToHex(addr), Severity::Debug);
log::debug("The address is: {}", utils::intToHex(addr));
return addr;
}
template<typename T>
inline intptr_t getNonVirtual(T func) {
log::debug("Get non-virtual function address from " + utils::intToHex(geode::cast::reference_cast<intptr_t>(func)));
log::debug("Get non-virtual function address from {}", utils::intToHex(geode::cast::reference_cast<intptr_t>(func)));
auto addr = Addresser::addressOfNonVirtual(func);
log::debug("The address is: " + utils::intToHex(addr));
log::debug("The address is: {}", utils::intToHex(addr));
return addr;
}

View file

@ -12,7 +12,7 @@ using geode::core::meta::x86::Thiscall;
static auto CCEGLVIEW_CON_ADDR = reinterpret_cast<void*>(base::getCocos() + 0xc2860);
static void __cdecl fixedErrorHandler(int code, const char* description) {
log::critical("GLFW Error ", code, ": ", description);
log::critical("GLFW Error {}: {}", code, description);
MessageBoxA(
nullptr,
CCString::createWithFormat(

View file

@ -262,7 +262,7 @@ void Index::addIndexItemFromFolder(ghc::filesystem::path const& dir) {
auto readJson = readJSON(dir / "index.json");
if (!readJson) {
log::warn("Error reading index.json: ", readJson.error(), ", skipping");
log::warn("Error reading index.json: {}, skipping", readJson.error());
return;
}
auto json = readJson.value();
@ -273,12 +273,12 @@ void Index::addIndexItemFromFolder(ghc::filesystem::path const& dir) {
auto readModJson = readJSON<ModJson>(dir / "mod.json");
if (!readModJson) {
log::warn("Error reading mod.json: ", readModJson.error(), ", skipping");
log::warn("Error reading mod.json: {}, skipping", readModJson.error());
return;
}
auto info = ModInfo::create(readModJson.value());
if (!info) {
log::warn(dir, ": ", info.error(), ", skipping");
log::warn("{}: {}, skipping", dir, info.error());
return;
}
@ -327,14 +327,14 @@ void Index::addIndexItemFromFolder(ghc::filesystem::path const& dir) {
}
} catch(std::exception& e) {
log::warn("[index.json] parsing error: ", e.what(), ", skipping");
log::warn("[index.json] parsing error: {}, skipping", e.what());
return;
}
m_items.push_back(item);
} else {
log::warn("Index directory ", dir, " is missing index.json, skipping");
log::warn("Index directory {} is missing index.json, skipping", dir);
}
}

View file

@ -15,7 +15,7 @@ void InstallTicket::postProgress(
});
}
if (status == UpdateStatus::Failed || status == UpdateStatus::Finished) {
log::info("Deleting InstallTicket at ", this);
log::info("Deleting InstallTicket at {}", this);
// clean up own memory
delete this;
}

View file

@ -30,7 +30,7 @@ Result<> Mod::enableHook(Hook* hook) {
if (!hook->isEnabled()) {
auto res = std::invoke(hook->m_addFunction, hook->m_address);
if (res) {
log::debug("Enabling hook at function ", hook->m_displayName);
log::debug("Enabling hook at function {}", hook->m_displayName);
this->m_hooks.push_back(hook);
hook->m_enabled = true;
hook->m_handle = res.value();

View file

@ -84,13 +84,7 @@ void Loader::updateModResources(Mod* mod) {
ccfu->fullPathForFilename(plist.c_str(), false)
)
) {
log::warn(
"The resource dir of \"",
mod->m_info.m_id,
"\" is missing \"",
sheet,
"\" png and/or plist files"
);
log::warn("The resource dir of \"{}\" is missing \"{}\" png and/or plist files", mod->m_info.m_id, sheet);
} else {
CCTextureCache::sharedTextureCache()->addImage(png.c_str(), false);
CCSpriteFrameCache::sharedSpriteFrameCache()
@ -112,7 +106,7 @@ void Loader::updateResources() {
size_t Loader::loadModsFromDirectory(
ghc::filesystem::path const& dir, bool recursive
) {
log::debug("Searching ", dir);
log::debug("Searching {}", dir);
size_t loadedCount = 0;
for (auto const& entry : ghc::filesystem::directory_iterator(dir)) {
@ -142,7 +136,7 @@ size_t Loader::loadModsFromDirectory(
// load mod
log::debug("Loading ", entry.path().string());
log::debug("Loading {}", entry.path().string());
auto res = this->loadModFromFile(entry.path().string());
if (res && res.value()) {
@ -151,13 +145,13 @@ size_t Loader::loadModsFromDirectory(
// check for dependencies
if (!res.value()->hasUnresolvedDependencies()) {
log::debug("Successfully loaded ", res.value());
log::debug("Successfully loaded {}", res.value());
} else {
log::error(res.value(), " has unresolved dependencies");
log::error("{} has unresolved dependencies", res.value());
}
} else {
// something went wrong
log::error(res.error());
log::error("{}", res.error());
m_erroredMods.push_back({ entry.path().string(), res.error() });
}
}
@ -182,7 +176,7 @@ size_t Loader::refreshMods() {
loadedCount += loadModsFromDirectory(dir, true);
}
log::debug("Loaded ", loadedCount, " mods");
log::debug("Loaded {} mods", loadedCount);
return loadedCount;
}

View file

@ -115,3 +115,62 @@ void Log::pushToLoader() {
std::string geode::log::generateLogName() {
return fmt::format("Geode_{:%H.%M.%S}.log", log_clock::now());
}
void geode::log::vlogImplSecretDontUse(Severity severity, Mod* mod, std::string_view formatStr, std::function<void(Log&)>* components, size_t componentsSize) {
Log log(mod, severity);
const auto pushSomething = [](Log& log, auto something) {
// i think this line of code is very sad
log.getComponents().push_back(new ComponentBase(something));
};
size_t compIndex = 0;
std::string current;
for (size_t i = 0; i < formatStr.size(); ++i) {
if (formatStr[i] == '{') {
if (i == formatStr.size() - 1)
throw std::runtime_error("Unescaped { at the end of format string");
const auto next = formatStr[i + 1];
if (next == '{') {
current.push_back('{');
++i;
continue;
}
if (next == '}') {
if (compIndex >= componentsSize)
throw std::runtime_error("Not enough arguments for format string");
pushSomething(log, current);
components[compIndex++](log);
current.clear();
++i;
continue;
}
throw std::runtime_error("You put something in between {} silly head");
}
if (formatStr[i] == '}') {
if (i == formatStr.size() - 1)
throw std::runtime_error("Unescaped } at the end of format string");
if (formatStr[i + 1] == '}') {
current.push_back('}');
++i;
continue;
}
throw std::runtime_error("You have an unescaped }");
}
current.push_back(formatStr[i]);
}
if (!current.empty())
pushSomething(log, current);
if (compIndex != componentsSize) {
throw std::runtime_error("You have left over arguments.. silly head");
// show_silly_error(formatStr);
}
// (l.getComponents().push_back(new ComponentBase(args)), ...);
log.pushToLoader();
}

View file

@ -409,22 +409,22 @@ bool Mod::updateDependencyStates() {
}
}
if (!hasUnresolved && !m_resolved) {
log::debug("All dependencies for ", m_info.m_id, " found");
log::debug("All dependencies for {} found", m_info.m_id);
m_resolved = true;
if (m_enabled) {
log::debug("Resolved & loading ", m_info.m_id);
log::debug("Resolved & loading {}", m_info.m_id);
auto r = this->load();
if (!r) {
log::error(this, " Error loading: ", r.error());
log::error("{} Error loading: {}", this, r.error());
}
else {
auto r = this->enable();
if (!r) {
log::error(this, " Error enabling: ", r.error());
log::error("{} Error enabling: {}", this, r.error());
}
}
} else {
log::debug("Resolved ", m_info.m_id, ", however not loading it as it is disabled");
log::debug("Resolved {}, however not loading it as it is disabled", m_info.m_id);
}
}
return hasUnresolved;

View file

@ -281,7 +281,7 @@ struct MDParser {
auto isClosing = tag.front() == '/';
if (isClosing) tag = tag.substr(1);
if (tag.front() != 'c') {
log::warn("Unknown tag ", text);
log::warn("Unknown tag {}", text);
renderer->renderString(text);
} else {
if (isClosing) {
@ -291,18 +291,18 @@ struct MDParser {
if (color) {
renderer->pushColor(color.value());
} else {
log::warn("Error parsing color: ", color.error());
log::warn("Error parsing color: {}", color.error());
}
}
}
} else {
log::warn("Too short tag ", text);
log::warn("Too short tag {}", text);
renderer->renderString(text);
}
} break;
default: {
log::warn("Unhandled text type ", type);
log::warn("Unhandled text type {}", type);
} break;
}
return 0;
@ -367,7 +367,7 @@ struct MDParser {
} break;
default: {
log::warn("Unhandled block enter type ", type);
log::warn("Unhandled block enter type {}", type);
} break;
}
return 0;
@ -449,7 +449,7 @@ struct MDParser {
case MD_BLOCKTYPE::MD_BLOCK_HR: {} break;
default: {
log::warn("Unhandled block leave type ", type);
log::warn("Unhandled block leave type {}", type);
} break;
}
return 0;
@ -490,7 +490,7 @@ struct MDParser {
} break;
default: {
log::warn("Unhandled span enter type ", type);
log::warn("Unhandled span enter type {}", type);
} break;
}
return 0;
@ -528,7 +528,7 @@ struct MDParser {
} break;
default: {
log::warn("Unhandled span leave type ", type);
log::warn("Unhandled span leave type {}", type);
} break;
}
return 0;