macOS: load device models from bundle resources
This commit is contained in:
@@ -104,8 +104,8 @@ enum DeviceModelCatalog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static func loadMapping(resourceName: String) -> [String: String] {
|
private static func loadMapping(resourceName: String) -> [String: String] {
|
||||||
guard let url = Bundle.module.url(
|
guard let url = self.resourceURL(
|
||||||
forResource: resourceName,
|
resourceName: resourceName,
|
||||||
withExtension: "json",
|
withExtension: "json",
|
||||||
subdirectory: "DeviceModels")
|
subdirectory: "DeviceModels")
|
||||||
else {
|
else {
|
||||||
@@ -121,6 +121,37 @@ enum DeviceModelCatalog {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static func resourceURL(
|
||||||
|
resourceName: String,
|
||||||
|
withExtension ext: String,
|
||||||
|
subdirectory: String
|
||||||
|
) -> URL? {
|
||||||
|
let bundledSubdir = "Clawdis_Clawdis.bundle/\(subdirectory)"
|
||||||
|
let mainBundle = Bundle.main
|
||||||
|
|
||||||
|
if let url = mainBundle.url(forResource: resourceName, withExtension: ext, subdirectory: bundledSubdir)
|
||||||
|
?? mainBundle.url(forResource: resourceName, withExtension: ext, subdirectory: subdirectory)
|
||||||
|
{
|
||||||
|
return url
|
||||||
|
}
|
||||||
|
|
||||||
|
let fallbackBases = [
|
||||||
|
mainBundle.resourceURL,
|
||||||
|
mainBundle.bundleURL.appendingPathComponent("Contents/Resources"),
|
||||||
|
mainBundle.bundleURL.deletingLastPathComponent(),
|
||||||
|
].compactMap { $0 }
|
||||||
|
|
||||||
|
let fileName = "\(resourceName).\(ext)"
|
||||||
|
for base in fallbackBases {
|
||||||
|
let bundled = base.appendingPathComponent(bundledSubdir).appendingPathComponent(fileName)
|
||||||
|
if FileManager.default.fileExists(atPath: bundled.path) { return bundled }
|
||||||
|
let loose = base.appendingPathComponent(subdirectory).appendingPathComponent(fileName)
|
||||||
|
if FileManager.default.fileExists(atPath: loose.path) { return loose }
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
private enum NameValue: Decodable {
|
private enum NameValue: Decodable {
|
||||||
case string(String)
|
case string(String)
|
||||||
case stringArray([String])
|
case stringArray([String])
|
||||||
|
|||||||
Reference in New Issue
Block a user