dependency-graph/Sources/PackageSwiftFileParserLive/Internal/PackageSwiftFileMapper.swift

48 lines
2.1 KiB
Swift

import DumpPackageService
import Foundation
import PackageSwiftFileParser
struct PackageSwiftFileMapper {
private let dumpPackageService: DumpPackageService
private let packageSwiftFileParser: PackageSwiftFileParser
init(dumpPackageService: DumpPackageService, packageSwiftFileParser: PackageSwiftFileParser) {
self.dumpPackageService = dumpPackageService
self.packageSwiftFileParser = packageSwiftFileParser
}
func map(_ intermediate: IntermediatePackageSwiftFile) throws -> PackageSwiftFile {
let targets = intermediate.targets.map(map)
let dependencies = try intermediate.dependencies.map(map)
return PackageSwiftFile(name: intermediate.name, targets: targets, dependencies: dependencies)
}
}
private extension PackageSwiftFileMapper {
private func map(_ intermediate: IntermediatePackageSwiftFile.Target) -> PackageSwiftFile.Target {
let dependencies = intermediate.dependencies.map(map)
return PackageSwiftFile.Target(name: intermediate.name, dependencies: dependencies)
}
private func map(_ intermediate: IntermediatePackageSwiftFile.Target.Dependency) -> PackageSwiftFile.Target.Dependency {
switch intermediate {
case .byName(let parameters):
return .name(parameters.name)
case .product(let parameters):
return .product(parameters.name, inPackage: parameters.package)
}
}
private func map(_ intermediate: IntermediatePackageSwiftFile.Dependency) throws -> PackageSwiftFile.Dependency {
switch intermediate {
case .sourceControl(let parameters):
return .sourceControl(identity: parameters.identity)
case .fileSystem(let parameters):
let fileURL = URL(filePath: parameters.path).appending(path: "Package.swift")
let contents = try dumpPackageService.dumpPackageForSwiftPackageFile(at: fileURL)
let packageSwiftFile = try packageSwiftFileParser.parseFile(at: fileURL)
return .fileSystem(identity: parameters.identity, path: parameters.path, packageSwiftFile: packageSwiftFile)
}
}
}