diff --git a/lib/modloader.dart b/lib/modloader.dart index 2f89812..8a4dca7 100644 --- a/lib/modloader.dart +++ b/lib/modloader.dart @@ -6,6 +6,19 @@ const modsRoot = '$root/294100'; const configRoot = '$root/AppData/RimWorld by Ludeon Studios/Config'; const configPath = '$configRoot/ModsConfig.xml'; +XmlElement findCaseInsensitive(XmlElement element, String name) { + return element.childElements.firstWhere( + (e) => e.name.local.toLowerCase() == name, + ); +} + +XmlElement findCaseInsensitiveDoc(XmlDocument document, String name) { + name = name.toLowerCase(); + return document.childElements.firstWhere( + (e) => e.name.local.toLowerCase() == name, + ); +} + class Mod { final String name; // ModMetaData.name final String id; // ModMetaData.packageId @@ -35,18 +48,59 @@ class Mod { static Mod fromDirectory(String path) { final aboutFile = File('$path/About/About.xml'); + if (!aboutFile.existsSync()) { + throw Exception('About.xml file does not exist in $aboutFile'); + } final aboutXml = XmlDocument.parse(aboutFile.readAsStringSync()); - final metadata = aboutXml.findElements('ModMetaData').first; - final name = metadata.findElements('name').first.innerText; - final id = metadata.findElements('packageId').first.innerText.toLowerCase(); - final versions = - metadata - .findElements('supportedVersions') - .first - .findElements('li') - .map((e) => e.innerText) - .toList(); - final description = metadata.findElements('description').first.innerText; + + late final XmlElement metadata; + try { + metadata = findCaseInsensitiveDoc(aboutXml, 'ModMetaData'); + } catch (e) { + throw Exception( + 'Error: ModMetaData element is missing in About.xml ($aboutFile). Original error: $e', + ); + } + + late final String name; + try { + name = metadata.findElements('name').first.innerText; + } catch (e) { + throw Exception( + 'Error: name element is missing in ModMetaData ($aboutFile). Original error: $e', + ); + } + + late final String id; + try { + id = metadata.findElements('packageId').first.innerText.toLowerCase(); + } catch (e) { + throw Exception( + 'Error: packageId element is missing in ModMetaData ($aboutFile). Original error: $e', + ); + } + + late final List versions; + try { + versions = + metadata + .findElements('supportedVersions') + .first + .findElements('li') + .map((e) => e.innerText) + .toList(); + } catch (e) { + throw Exception( + 'Error: supportedVersions or li elements are missing in ModMetaData ($aboutFile). Original error: $e', + ); + } + + String description = ''; + try { + description = metadata.findElements('description').first.innerText; + } catch (e) { + print('$name has no description'); + } List hardDependencies = []; try {