add importance to incompat

This commit is contained in:
ConfiG 2023-08-09 19:05:14 +03:00
parent e7180695b8
commit 8908235234
No known key found for this signature in database
GPG key ID: 44DA1983F524C11B
5 changed files with 48 additions and 9 deletions

View file

@ -25,6 +25,7 @@ namespace geode {
Unknown,
Suggestion,
Recommendation,
Conflict,
InvalidFile,
Duplicate,
SetupFailed,

View file

@ -51,8 +51,13 @@ namespace geode {
};
struct GEODE_DLL Incompatibility {
enum class Importance : uint8_t {
Breaking,
Conflicting
};
std::string id;
ComparableVersionInfo version;
Importance importance = Importance::Breaking;
Mod* mod = nullptr;
[[nodiscard]] bool isResolved() const;
};

View file

@ -486,12 +486,24 @@ void Loader::Impl::findProblems() {
for (auto const& dep : mod->getMetadata().getIncompatibilities()) {
if (!dep.mod || !dep.version.compare(dep.mod->getVersion()))
continue;
m_problems.push_back({
LoadProblem::Type::PresentIncompatibility,
mod,
fmt::format("{} {}", dep.id, dep.version.toString())
});
log::error("{} is incompatible with {} {}", id, dep.id, dep.version);
switch(dep.importance) {
case ModMetadata::Incompatibility::Importance::Conflicting:
m_problems.push_back({
LoadProblem::Type::Conflict,
mod,
fmt::format("{} {}", dep.id, dep.version.toString())
});
log::warn("{} conflicts with {} {}", id, dep.id, dep.version);
break;
case ModMetadata::Incompatibility::Importance::Breaking:
m_problems.push_back({
LoadProblem::Type::PresentIncompatibility,
mod,
fmt::format("{} {}", dep.id, dep.version.toString())
});
log::error("{} breaks {} {}", id, dep.id, dep.version);
break;
}
}
Mod* myEpicMod = mod; // clang fix

View file

@ -349,7 +349,7 @@ Result<> Mod::Impl::enable() {
bool enabledDependencies = true;
for (auto const& item : m_metadata.getDependencies()) {
if (!item.isResolved())
if (!item.isResolved() || !item.mod)
continue;
auto res = item.mod->enable();
if (!res) {

View file

@ -18,11 +18,12 @@ ModMetadata::Impl& ModMetadataImpl::getImpl(ModMetadata& info) {
bool ModMetadata::Dependency::isResolved() const {
return this->importance != Importance::Required ||
(this->mod && this->mod->isLoaded() && this->version.compare(this->mod->getVersion()));
this->mod && this->mod->isLoaded() && this->version.compare(this->mod->getVersion());
}
bool ModMetadata::Incompatibility::isResolved() const {
return !this->mod || !this->version.compare(this->mod->getVersion());
return this->importance != Importance::Breaking ||
(!this->mod || !this->version.compare(this->mod->getVersion()));
}
ModMetadata::Dependency::operator geode::Dependency() {
@ -138,6 +139,7 @@ Result<ModMetadata> ModMetadata::Impl::createFromSchemaV010(ModJson const& rawJs
Incompatibility incompatibility;
obj.needs("id").validate(MiniFunction<bool(std::string const&)>(&ModMetadata::validateID)).into(incompatibility.id);
obj.needs("version").into(incompatibility.version);
obj.has("importance").into(incompatibility.importance);
obj.checkUnknownKeys();
impl->m_incompatibilities.push_back(incompatibility);
@ -512,3 +514,22 @@ struct json::Serialize<geode::ModMetadata::Dependency::Importance> {
throw json::JsonException(R"(Expected importance to be "required", "recommended" or "suggested")");
}
};
template <>
struct json::Serialize<geode::ModMetadata::Incompatibility::Importance> {
static json::Value GEODE_DLL to_json(geode::ModMetadata::Incompatibility::Importance const& importance) {
switch (importance) {
case geode::ModMetadata::Incompatibility::Importance::Breaking: return {"breaking"};
case geode::ModMetadata::Incompatibility::Importance::Conflicting: return {"conflicting"};
default: return {"unknown"};
}
}
static geode::ModMetadata::Incompatibility::Importance GEODE_DLL from_json(json::Value const& importance) {
auto impStr = importance.as_string();
if (impStr == "breaking")
return geode::ModMetadata::Incompatibility::Importance::Breaking;
if (impStr == "conflicting")
return geode::ModMetadata::Incompatibility::Importance::Conflicting;
throw json::JsonException(R"(Expected importance to be "breaking" or "conflicting")");
}
};