diff --git a/Sources/XcodeMetadata/Providers/SystemFrameworkMetadataProvider.swift b/Sources/XcodeMetadata/Providers/SystemFrameworkMetadataProvider.swift index f69144df..e9825c68 100644 --- a/Sources/XcodeMetadata/Providers/SystemFrameworkMetadataProvider.swift +++ b/Sources/XcodeMetadata/Providers/SystemFrameworkMetadataProvider.swift @@ -6,12 +6,16 @@ import XcodeGraph public enum SystemFrameworkMetadataProviderError: LocalizedError, Equatable { case unsupportedSDK(name: String) + case unsupportedSDKPlatform(sdk: String, platform: Platform, supported: [Platform]) public var errorDescription: String? { switch self { case let .unsupportedSDK(sdk): let supportedTypes = SDKType.supportedTypesDescription return "The SDK type of \(sdk) is not currently supported - only \(supportedTypes) are supported." + case let .unsupportedSDKPlatform(sdk, platform, supported): + let platforms = supported.map(\.caseValue).joined(separator: ", ") + return "The Platform type of \(platform.caseValue) is not currently supported for \(sdk) - only \(platforms) are supported." } } } @@ -38,7 +42,7 @@ public final class SystemFrameworkMetadataProvider: SystemFrameworkMetadataProvi sdkName: String, status: LinkingStatus, platform: Platform, - source: SDKSource + source sdkSource: SDKSource ) throws -> SystemFrameworkMetadata { let sdkNamePath = try AbsolutePath(validating: "/\(sdkName)") guard let sdkExtension = sdkNamePath.extension @@ -58,6 +62,15 @@ public final class SystemFrameworkMetadataProvider: SystemFrameworkMetadataProvi throw SystemFrameworkMetadataProviderError.unsupportedSDK(name: sdkName) } + var source = sdkSource + if sdkName == "XcodeKit.framework" { + source = .developer + if platform != .macOS { + throw SystemFrameworkMetadataProviderError + .unsupportedSDKPlatform(sdk: sdkName, platform: platform, supported: [.macOS]) + } + } + let path = try sdkPath(name: sdkName, platform: platform, type: sdkType, source: source) return SystemFrameworkMetadata( name: sdkName, @@ -70,7 +83,7 @@ public final class SystemFrameworkMetadataProvider: SystemFrameworkMetadataProvi private func sdkPath(name: String, platform: Platform, type: SDKType, source: SDKSource) throws -> AbsolutePath { switch source { case .developer: - let xcodeDeveloperSdkRootPath = platform.xcodeDeveloperSdkRootPath + let xcodeDeveloperSdkRootPath = name == "XcodeKit.framework" ? "Library" : platform.xcodeDeveloperSdkRootPath let sdkRootPath = try AbsolutePath(validating: "/\(xcodeDeveloperSdkRootPath)") return sdkRootPath .appending(try RelativePath(validating: "Frameworks")) diff --git a/Tests/XcodeMetadataTests/SystemFrameworkMetadataProviderTests.swift b/Tests/XcodeMetadataTests/SystemFrameworkMetadataProviderTests.swift index 11d4d152..97ec68ec 100644 --- a/Tests/XcodeMetadataTests/SystemFrameworkMetadataProviderTests.swift +++ b/Tests/XcodeMetadataTests/SystemFrameworkMetadataProviderTests.swift @@ -84,6 +84,21 @@ struct SystemFrameworkMetadataProviderTests { } } + @Test + func loadMetadataUnsupportedPlatform() throws { + // Given + let sdkName = "XcodeKit.framework" + let platform = Platform.iOS + + // When / Then + #expect( + throws: SystemFrameworkMetadataProviderError + .unsupportedSDKPlatform(sdk: sdkName, platform: platform, supported: [.macOS]) + ) { + try subject.loadMetadata(sdkName: sdkName, status: .required, platform: platform, source: .system) + } + } + @Test func loadMetadataDeveloperSourceSupportedPlatform() throws { // Given @@ -105,4 +120,26 @@ struct SystemFrameworkMetadataProviderTests { "Metadata does not match expected value" ) } + + @Test + func loadMetadataXcodeKit() throws { + // Given + let sdkName = "XcodeKit.framework" + let platform = Platform.macOS + let source = SDKSource.system + + // When + let metadata = try subject.loadMetadata(sdkName: sdkName, status: .required, platform: platform, source: source) + + // Then + #expect( + metadata == SystemFrameworkMetadata( + name: sdkName, + path: "/Library/Frameworks/XcodeKit.framework", + status: .required, + source: .developer + ), + "Metadata does not match expected value" + ) + } }