mirror of
https://github.com/yonaskolb/XcodeGen.git
synced 2026-03-18 20:02:25 +00:00
153 lines
4.8 KiB
Swift
153 lines
4.8 KiB
Swift
import Foundation
|
|
import JSONUtilities
|
|
|
|
public struct Dependency: Equatable {
|
|
public static let removeHeadersDefault = true
|
|
public static let implicitDefault = false
|
|
public static let weakLinkDefault = false
|
|
|
|
public var type: DependencyType
|
|
public var reference: String
|
|
public var embed: Bool?
|
|
public var codeSign: Bool?
|
|
public var removeHeaders: Bool = removeHeadersDefault
|
|
public var link: Bool?
|
|
public var implicit: Bool = implicitDefault
|
|
public var weakLink: Bool = weakLinkDefault
|
|
|
|
public init(
|
|
type: DependencyType,
|
|
reference: String,
|
|
embed: Bool? = nil,
|
|
codeSign: Bool? = nil,
|
|
link: Bool? = nil,
|
|
implicit: Bool = implicitDefault,
|
|
weakLink: Bool = weakLinkDefault
|
|
) {
|
|
self.type = type
|
|
self.reference = reference
|
|
self.embed = embed
|
|
self.codeSign = codeSign
|
|
self.link = link
|
|
self.implicit = implicit
|
|
self.weakLink = weakLink
|
|
}
|
|
|
|
public enum CarthageLinkType: String {
|
|
case dynamic
|
|
case `static`
|
|
|
|
public static let `default` = dynamic
|
|
}
|
|
|
|
public enum DependencyType: Equatable {
|
|
case target
|
|
case framework
|
|
case carthage(findFrameworks: Bool?, linkType: CarthageLinkType)
|
|
case sdk(root: String?)
|
|
case package(product: String?)
|
|
case bundle
|
|
}
|
|
}
|
|
|
|
extension Dependency: Hashable {
|
|
public func hash(into hasher: inout Hasher) {
|
|
hasher.combine(reference)
|
|
}
|
|
}
|
|
|
|
extension Dependency: JSONObjectConvertible {
|
|
|
|
public init(jsonDictionary: JSONDictionary) throws {
|
|
if let target: String = jsonDictionary.json(atKeyPath: "target") {
|
|
type = .target
|
|
reference = target
|
|
} else if let framework: String = jsonDictionary.json(atKeyPath: "framework") {
|
|
type = .framework
|
|
reference = framework
|
|
} else if let carthage: String = jsonDictionary.json(atKeyPath: "carthage") {
|
|
let findFrameworks: Bool? = jsonDictionary.json(atKeyPath: "findFrameworks")
|
|
let carthageLinkType: CarthageLinkType = (jsonDictionary.json(atKeyPath: "linkType") as String?).flatMap(CarthageLinkType.init(rawValue:)) ?? .default
|
|
type = .carthage(findFrameworks: findFrameworks, linkType: carthageLinkType)
|
|
reference = carthage
|
|
} else if let sdk: String = jsonDictionary.json(atKeyPath: "sdk") {
|
|
let sdkRoot: String? = jsonDictionary.json(atKeyPath: "root")
|
|
type = .sdk(root: sdkRoot)
|
|
reference = sdk
|
|
} else if let package: String = jsonDictionary.json(atKeyPath: "package") {
|
|
let product: String? = jsonDictionary.json(atKeyPath: "product")
|
|
type = .package(product: product)
|
|
reference = package
|
|
} else if let bundle: String = jsonDictionary.json(atKeyPath: "bundle") {
|
|
type = .bundle
|
|
reference = bundle
|
|
} else {
|
|
throw SpecParsingError.invalidDependency(jsonDictionary)
|
|
}
|
|
|
|
embed = jsonDictionary.json(atKeyPath: "embed")
|
|
codeSign = jsonDictionary.json(atKeyPath: "codeSign")
|
|
link = jsonDictionary.json(atKeyPath: "link")
|
|
|
|
if let bool: Bool = jsonDictionary.json(atKeyPath: "removeHeaders") {
|
|
removeHeaders = bool
|
|
}
|
|
if let bool: Bool = jsonDictionary.json(atKeyPath: "implicit") {
|
|
implicit = bool
|
|
}
|
|
if let bool: Bool = jsonDictionary.json(atKeyPath: "weak") {
|
|
weakLink = bool
|
|
}
|
|
}
|
|
}
|
|
|
|
extension Dependency: JSONEncodable {
|
|
public func toJSONValue() -> Any {
|
|
var dict: [String: Any?] = [
|
|
"embed": embed,
|
|
"codeSign": codeSign,
|
|
"link": link,
|
|
]
|
|
|
|
if removeHeaders != Dependency.removeHeadersDefault {
|
|
dict["removeHeaders"] = removeHeaders
|
|
}
|
|
if implicit != Dependency.implicitDefault {
|
|
dict["implicit"] = implicit
|
|
}
|
|
if weakLink != Dependency.weakLinkDefault {
|
|
dict["weak"] = weakLink
|
|
}
|
|
|
|
switch type {
|
|
case .target:
|
|
dict["target"] = reference
|
|
case .framework:
|
|
dict["framework"] = reference
|
|
case .carthage(let findFrameworks, let linkType):
|
|
dict["carthage"] = reference
|
|
if let findFrameworks = findFrameworks {
|
|
dict["findFrameworks"] = findFrameworks
|
|
}
|
|
dict["linkType"] = linkType.rawValue
|
|
case .sdk:
|
|
dict["sdk"] = reference
|
|
case .package:
|
|
dict["package"] = reference
|
|
case .bundle:
|
|
dict["bundle"] = reference
|
|
}
|
|
|
|
return dict
|
|
}
|
|
}
|
|
|
|
extension Dependency: PathContainer {
|
|
|
|
static var pathProperties: [PathProperty] {
|
|
[
|
|
.string("framework"),
|
|
]
|
|
}
|
|
}
|