mirror of
https://github.com/geode-sdk/geode.git
synced 2025-02-17 00:30:26 -05:00
add importance to incompat
This commit is contained in:
parent
e7180695b8
commit
8908235234
5 changed files with 48 additions and 9 deletions
|
@ -25,6 +25,7 @@ namespace geode {
|
|||
Unknown,
|
||||
Suggestion,
|
||||
Recommendation,
|
||||
Conflict,
|
||||
InvalidFile,
|
||||
Duplicate,
|
||||
SetupFailed,
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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")");
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue