// The Factorio mods directory contains a "mod-list.json" file that contains the // enabled states of each mod in the directory. use encoding::json; use strings; type modlist = []modlist_entry; type modlist_entry = struct { name: str, enabled: bool, version: (version | void), }; fn modlist_free(modlist: modlist) void = { for (let entry &.. modlist) { free(entry.name); }; }; // Marshals a [[modlist]] into a [[json::value]] for writing. The return value // must be freed with [[encoding::json::finish]]. fn modlist_marshal(modlist: modlist) json::value = { let mods: []json::value = []; for (let mod &.. modlist) { let mod_obj = json::newobject(); json::set(&mod_obj, "name", strings::dup(mod.name)!)!; json::set(&mod_obj, "enabled", mod.enabled)!; if (mod.version is version) { json::set(&mod_obj, "version", version_str(mod.version as version, false))!; }; append(mods, mod_obj)!; }; let json = json::newobject(); json::set(&json, "mods", mods)!; return json; }; // Unmarshals a [[modlist]] from a [[json::value]]. The return value must be // freed with [[modlist_free]]. This function assumes that the input is valid. fn modlist_unmarshal(root: json::value) modlist = { const mods = json::get(&(root as json::object), "mods") as *json::value; const mods = *mods as []json::value; let modlist: []modlist_entry = []; for (const mod .. mods) { const mod = mod as json::object; const name = json::get(&mod, "name") as *json::value; const enabled = json::get(&mod, "enabled") as *json::value; const version: (version | void) = match (json::get(&mod, "version")) { case let version: *json::value => yield version_parse(*version as str)!; case => yield void; }; append(modlist, modlist_entry { name = strings::dup(*name as str)!, enabled = *enabled as bool, version = version, })!; }; return modlist; };