Skip to content

Commit e02f9bc

Browse files
committed
Refactor importer lookup
1 parent 9c3dc77 commit e02f9bc

File tree

4 files changed

+23
-43
lines changed

4 files changed

+23
-43
lines changed

Sources/GateEngine/Resources/Animation/ObjectAnimation3D.swift

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -459,12 +459,10 @@ public final class ObjectAnimation3DBackend {
459459

460460
// MARK: - Resource Manager
461461

462-
public protocol ObjectAnimation3DImporter: AnyObject {
462+
public protocol ObjectAnimation3DImporter: ResourceImporter {
463463
init()
464464

465465
func process(data: Data, baseURL: URL, options: ObjectAnimation3DImporterOptions) async throws -> ObjectAnimation3DBackend
466-
467-
static func supportedFileExtensions() -> [String]
468466
}
469467

470468
public struct ObjectAnimation3DImporterOptions: Equatable, Hashable, Sendable {
@@ -486,16 +484,14 @@ extension ResourceManager {
486484
}
487485
importers.objectAnimation3DImporters.insert(type, at: 0)
488486
}
489-
490-
fileprivate func importerForFileType(_ file: String) -> (any ObjectAnimation3DImporter)? {
487+
488+
func objectAnimation3DImporterForPath(_ path: String) async throws(GateEngineError) -> any ObjectAnimation3DImporter {
491489
for type in self.importers.objectAnimation3DImporters {
492-
if type.supportedFileExtensions().contains(where: {
493-
$0.caseInsensitiveCompare(file) == .orderedSame
494-
}) {
495-
return type.init()
490+
if type.canProcessFile(path) {
491+
return try await self.importers.getImporter(path: path, type: type)
496492
}
497493
}
498-
return nil
494+
throw .custom(category: "\(Self.self)", message: "No ObjectAnimation3DImporter could be found for \(path)")
499495
}
500496
}
501497

@@ -622,12 +618,7 @@ extension ResourceManager {
622618
let path = key.requestedPath
623619

624620
do {
625-
guard let fileExtension = path.components(separatedBy: ".").last else {
626-
throw GateEngineError.failedToLoad(resource: path, "Unknown file type.")
627-
}
628-
guard let importer: any ObjectAnimation3DImporter = Game.unsafeShared.resourceManager.importerForFileType(fileExtension) else {
629-
throw GateEngineError.failedToLoad(resource: path, "No ObjectAnimation3DImporter for \(fileExtension).")
630-
}
621+
let importer: any ObjectAnimation3DImporter = try await Game.unsafeShared.resourceManager.objectAnimation3DImporterForPath(path)
631622

632623
let data = try await Platform.current.loadResource(from: path)
633624
let backend = try await importer.process(

Sources/GateEngine/Resources/CollisionMesh/CollisionMesh.swift

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -165,13 +165,13 @@ extension ResourceManager {
165165
importers.collisionMeshImporters.insert(type, at: 0)
166166
}
167167

168-
fileprivate func importerForFileType(_ file: String) async throws -> (any CollisionMeshImporter)? {
168+
func collisionMeshImporterForPath(_ path: String) async throws(GateEngineError) -> any CollisionMeshImporter {
169169
for type in self.importers.collisionMeshImporters {
170-
if type.canProcessFile(file) {
171-
return try await self.importers.getImporter(path: file, type: type)
170+
if type.canProcessFile(path) {
171+
return try await self.importers.getImporter(path: path, type: type)
172172
}
173173
}
174-
return nil
174+
throw .custom(category: "\(Self.self)", message: "No CollisionMeshImporter could be found for \(path)")
175175
}
176176
}
177177

@@ -287,12 +287,9 @@ extension ResourceManager {
287287
let path = key.requestedPath
288288

289289
do {
290-
guard let importer: any CollisionMeshImporter = try await Game.unsafeShared.resourceManager.importerForFileType(path) else {
291-
throw GateEngineError.failedToLoad(resource: path, "No CollisionMeshImporter for \(URL(fileURLWithPath: path).pathExtension).")
292-
}
293-
290+
let importer: any CollisionMeshImporter = try await Game.unsafeShared.resourceManager.collisionMeshImporterForPath(path)
294291
let rawCollisionMesh = try await importer.loadCollisionMesh(options: key.collisionMeshOptions)
295-
292+
296293
Task { @MainActor in
297294
if let cache = cache.collisionMeshes[key] {
298295
cache.collisionMeshBackend = CollisionMeshBackend(rawCollisionMesh: rawCollisionMesh)

Sources/GateEngine/Resources/Tiles/TileMap.swift

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -248,13 +248,13 @@ extension ResourceManager {
248248
importers.tileMapImporters.insert(type, at: 0)
249249
}
250250

251-
fileprivate func importerForFileType(_ file: String) async throws -> (any TileMapImporter)? {
251+
func tileMapImporterForPath(_ path: String) async throws(GateEngineError) -> any TileMapImporter {
252252
for type in self.importers.tileMapImporters {
253-
if type.canProcessFile(file) {
254-
return try await self.importers.getImporter(path: file, type: type)
253+
if type.canProcessFile(path) {
254+
return try await self.importers.getImporter(path: path, type: type)
255255
}
256256
}
257-
return nil
257+
throw .custom(category: "\(Self.self)", message: "No TileMapImporter could be found for \(path)")
258258
}
259259
}
260260

@@ -369,12 +369,7 @@ extension ResourceManager {
369369
let path = key.requestedPath
370370

371371
do {
372-
guard
373-
let importer: any TileMapImporter = try await Game.unsafeShared.resourceManager.importerForFileType(path)
374-
else {
375-
throw GateEngineError.failedToLoad(resource: path, "No TileMapImporter for \(URL(fileURLWithPath: path).pathExtension).")
376-
}
377-
372+
let importer: any TileMapImporter = try await Game.unsafeShared.resourceManager.tileMapImporterForPath(path)
378373
let backend = try await importer.loadTileMap(options: key.tileMapOptions)
379374

380375
Task { @MainActor in

Sources/GateEngine/Resources/Tiles/TileSet.swift

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -175,13 +175,13 @@ extension ResourceManager {
175175
importers.tileSetImporters.insert(type, at: 0)
176176
}
177177

178-
fileprivate func importerForFileType(_ file: String) async throws -> (any TileSetImporter)? {
178+
func tileSetImporterForPath(_ path: String) async throws(GateEngineError) -> any TileSetImporter {
179179
for type in self.importers.tileSetImporters {
180-
if type.canProcessFile(file) {
181-
return try await self.importers.getImporter(path: file, type: type)
180+
if type.canProcessFile(path) {
181+
return try await self.importers.getImporter(path: path, type: type)
182182
}
183183
}
184-
return nil
184+
throw .custom(category: "\(Self.self)", message: "No TileSetImporter could be found for \(path)")
185185
}
186186
}
187187

@@ -300,10 +300,7 @@ extension ResourceManager {
300300
let path = key.requestedPath
301301

302302
do {
303-
guard let importer: any TileSetImporter = try await Game.unsafeShared.resourceManager.importerForFileType(path) else {
304-
throw GateEngineError.failedToLoad(resource: path, "No TileSetImporter for \(URL(fileURLWithPath: path).pathExtension).")
305-
}
306-
303+
let importer: any TileSetImporter = try await Game.unsafeShared.resourceManager.tileSetImporterForPath(path)
307304
let backend = try await importer.loadTileSet(options: key.tileSetOptions)
308305

309306
Task { @MainActor in

0 commit comments

Comments
 (0)