99import Foundation
1010
1111public 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