diff --git a/Sources/XcodeGraph/Models/Version.swift b/Sources/XcodeGraph/Models/Version.swift index 49d8f500..215c631c 100644 --- a/Sources/XcodeGraph/Models/Version.swift +++ b/Sources/XcodeGraph/Models/Version.swift @@ -35,6 +35,17 @@ public struct Version: Hashable, Codable, Sendable { self.buildMetadataIdentifiers = buildMetadataIdentifiers } + public init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + let value = try container.decode(String.self) + + guard let version = Version(string: value) else { + fatalError("\(value) is not a valid version") + } + + self = version + } + /// Returns the value that Xcode projects use internally. public var xcodeStringValue: String { "\(major)\(minor)\(patch)" diff --git a/Tests/XcodeGraphTests/Models/VersionTests.swift b/Tests/XcodeGraphTests/Models/VersionTests.swift index 01d79b46..6ee1498d 100644 --- a/Tests/XcodeGraphTests/Models/VersionTests.swift +++ b/Tests/XcodeGraphTests/Models/VersionTests.swift @@ -13,4 +13,12 @@ final class VersionTests: XCTestCase { // Then XCTAssertEqual(got, "123") } + + func test_codable() { + // Given + let version = Version(stringLiteral: "1.2.3") + + // Then + XCTAssertCodable(version) + } }