diff --git a/Sources/XcodeGraph/PackageInfo.swift b/Sources/XcodeGraph/PackageInfo.swift index 7be49ca1..781c00e0 100644 --- a/Sources/XcodeGraph/PackageInfo.swift +++ b/Sources/XcodeGraph/PackageInfo.swift @@ -13,6 +13,9 @@ public struct PackageInfo: Equatable, Hashable { /// The targets declared in the manifest. public let targets: [Target] + /// The traits the package supports + public let traits: [PackageTrait]? + /// The declared platforms in the manifest. public let platforms: [Platform] @@ -46,6 +49,7 @@ public struct PackageInfo: Equatable, Hashable { name: String, products: [Product], targets: [Target], + traits: [PackageTrait]?, platforms: [Platform], cLanguageStandard: String?, cxxLanguageStandard: String?, @@ -55,6 +59,7 @@ public struct PackageInfo: Equatable, Hashable { self.name = name self.products = products self.targets = targets + self.traits = traits self.platforms = platforms self.cLanguageStandard = cLanguageStandard self.cxxLanguageStandard = cxxLanguageStandard @@ -588,7 +593,8 @@ extension PackageInfo: Codable { } private enum CodingKeys: String, CodingKey { - case name, products, targets, platforms, cLanguageStandard, cxxLanguageStandard, swiftLanguageVersions, toolsVersion + case name, products, targets, platforms, cLanguageStandard, cxxLanguageStandard, swiftLanguageVersions, toolsVersion, + traits } public init(from decoder: Decoder) throws { @@ -615,6 +621,7 @@ extension PackageInfo: Codable { ) } self.toolsVersion = toolsVersion + traits = try values.decodeIfPresent([PackageTrait].self, forKey: .traits) } public func encode(to encoder: any Encoder) throws { @@ -623,6 +630,7 @@ extension PackageInfo: Codable { try container.encode(products, forKey: .products) try container.encode(targets, forKey: .targets) try container.encode(platforms, forKey: .platforms) + try container.encode(traits, forKey: .traits) try container.encodeIfPresent(cLanguageStandard, forKey: .cLanguageStandard) try container.encodeIfPresent(cxxLanguageStandard, forKey: .cxxLanguageStandard) try container.encodeIfPresent(swiftLanguageVersions, forKey: .swiftLanguageVersions) @@ -795,6 +803,7 @@ extension PackageInfo.Target.TargetType { name: String = "Package", products: [Product] = [], targets: [Target] = [], + traits: [PackageTrait] = [], platforms: [Platform] = [], cLanguageStandard: String? = nil, cxxLanguageStandard: String? = nil, @@ -805,6 +814,7 @@ extension PackageInfo.Target.TargetType { name: name, products: products, targets: targets, + traits: traits, platforms: platforms, cLanguageStandard: cLanguageStandard, cxxLanguageStandard: cxxLanguageStandard, diff --git a/Sources/XcodeGraph/PackageTrait.swift b/Sources/XcodeGraph/PackageTrait.swift new file mode 100644 index 00000000..c4dd682a --- /dev/null +++ b/Sources/XcodeGraph/PackageTrait.swift @@ -0,0 +1,10 @@ +public struct PackageTrait: Equatable, Hashable, Codable { + /// The list of traits that are enabled by default. + public let enabledTraits: [String] + + /// The name of the trait. When a trait just includes enabled traits, this name takes the value of "default" + public let name: String + + /// Trait description + public let description: String? +} diff --git a/Tests/XcodeGraphTests/Models/PackageInfoTests.swift b/Tests/XcodeGraphTests/Models/PackageInfoTests.swift index c8d45ce0..12bbbd47 100644 --- a/Tests/XcodeGraphTests/Models/PackageInfoTests.swift +++ b/Tests/XcodeGraphTests/Models/PackageInfoTests.swift @@ -54,6 +54,13 @@ struct PackageInfoTests { checksum: nil ), ], + traits: [ + PackageTrait( + enabledTraits: ["Tuist"], + name: "Tuist", + description: "This is the default Tuist trait" + ), + ], platforms: [ PackageInfo.Platform(platformName: "iOS", version: "17.2", options: []), ],