Skip to content

Commit ba2d124

Browse files
committed
make project file have a non-optional return and take advantage of throws
1 parent a20ed24 commit ba2d124

File tree

1 file changed

+31
-28
lines changed

1 file changed

+31
-28
lines changed

Sources/XcodeProject/ProjectFile.swift

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
import Foundation
1010

1111
public final class ProjectFile {
12+
enum Error: Swift.Error {
13+
case invalid
14+
case invalidPlist
15+
case missingProject
16+
}
1217
struct RootKey {
1318
static let classes = "classes"
1419
static let objects = "objects"
@@ -38,13 +43,9 @@ public final class ProjectFile {
3843
///
3944
/// - Parameter url: Path to an xcodeproj file to be opened
4045
/// - Returns: A fully parsed project from the provided source or `nil` if an error happened
41-
public init?(url: URL) throws {
46+
public init(url: URL) throws {
4247
self.url = url
43-
do {
44-
self.fileWrapper = try FileWrapper(url: url, options: [])
45-
} catch {
46-
return nil
47-
}
48+
self.fileWrapper = try FileWrapper(url: url, options: [])
4849
guard fileWrapper.isDirectory else {
4950
throw CocoaError.error(.fileReadUnknown)
5051
}
@@ -54,31 +55,33 @@ public final class ProjectFile {
5455
}
5556

5657
guard let data = pbxproj.regularFileContents else {
57-
return nil
58+
throw Error.invalid
5859
}
5960

60-
do {
61-
guard let plist = try PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [String: Any] else { return nil }
62-
guard
63-
let archiveVersionString = plist[RootKey.archiveVersion] as? String, let archiveVersion = UInt(archiveVersionString),
64-
let objectVersionString = plist[RootKey.objectVersion] as? String, let objectVersionInt = UInt(objectVersionString), let objectVersion = ObjectVersion(rawValue: objectVersionInt),
65-
let rootObject = PBXObject.ID(rawValue: plist[RootKey.rootObject] as? String),
66-
let classes = plist[RootKey.classes] as? [AnyHashable: Any], classes.isEmpty
67-
else {
68-
return nil
69-
}
70-
self.archiveVersion = archiveVersion
71-
self.objectVersion = objectVersion
72-
self.rootObject = rootObject
73-
self.classes = classes
74-
guard let objects = plist[RootKey.objects] as? [String: Any] else { return nil }
75-
let objectCache = ObjectCache(plist: objects, types: types)
76-
guard let project = objectCache.object(for: rootObject) as? PBXProject else { return nil }
77-
project.path = url.path
78-
self.project = project
79-
} catch {
80-
return nil
61+
guard let plist = try PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [String: Any] else {
62+
throw Error.invalidPlist
63+
}
64+
guard
65+
let archiveVersionString = plist[RootKey.archiveVersion] as? String, let archiveVersion = UInt(archiveVersionString),
66+
let objectVersionString = plist[RootKey.objectVersion] as? String, let objectVersionInt = UInt(objectVersionString), let objectVersion = ObjectVersion(rawValue: objectVersionInt),
67+
let rootObject = PBXObject.ID(rawValue: plist[RootKey.rootObject] as? String),
68+
let classes = plist[RootKey.classes] as? [AnyHashable: Any], classes.isEmpty
69+
else {
70+
throw Error.invalidPlist
71+
}
72+
self.archiveVersion = archiveVersion
73+
self.objectVersion = objectVersion
74+
self.rootObject = rootObject
75+
self.classes = classes
76+
guard let objects = plist[RootKey.objects] as? [String: Any] else {
77+
throw Error.invalidPlist
78+
}
79+
let objectCache = ObjectCache(plist: objects, types: types)
80+
guard let project = objectCache.object(for: rootObject) as? PBXProject else {
81+
throw Error.missingProject
8182
}
83+
project.path = url.path
84+
self.project = project
8285
}
8386

8487
public func currentFileWrapper() throws -> FileWrapper {

0 commit comments

Comments
 (0)