mirror of
https://github.com/geode-sdk/geode.git
synced 2025-04-24 05:14:40 -04:00
switch to {} style formatting for logs
This commit is contained in:
parent
0c19e0c75d
commit
c5538da709
11 changed files with 109 additions and 46 deletions
loader
include/Geode
src
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue