Skip to content

Commit 8ba34c4

Browse files
committed
Make Year and Month Codable
1 parent c97a0d2 commit 8ba34c4

File tree

5 files changed

+80
-0
lines changed

5 files changed

+80
-0
lines changed

Sources/SwiftYMD/Month.swift

+16
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,22 @@ extension Month: Equatable, Comparable, Hashable {
1919
}
2020
}
2121

22+
extension Month: Codable {
23+
public init(from decoder: Decoder) throws {
24+
let container = try decoder.singleValueContainer()
25+
let value = try container.decode(String.self)
26+
guard let month = Month.allCases.first(where: { $0.description == value }) else {
27+
throw DecodingError.dataCorrupted(DecodingError.Context.init(codingPath: decoder.codingPath, debugDescription: "Illegal value: \(value)"))
28+
}
29+
self = month
30+
}
31+
32+
public func encode(to encoder: Encoder) throws {
33+
var container = encoder.singleValueContainer()
34+
try container.encode(description)
35+
}
36+
}
37+
2238
extension Month: ExpressibleByIntegerLiteral {
2339
public init(integerLiteral value: Int) {
2440
self.init(rawValue: value)!

Sources/SwiftYMD/Year.swift

+13
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,19 @@ extension Year: Strideable {
3939
}
4040
}
4141

42+
extension Year: Codable {
43+
public init(from decoder: Decoder) throws {
44+
let container = try decoder.singleValueContainer()
45+
let value = try container.decode(Int.self)
46+
self.init(value)
47+
}
48+
49+
public func encode(to encoder: Encoder) throws {
50+
var container = encoder.singleValueContainer()
51+
try container.encode(rawValue)
52+
}
53+
}
54+
4255
extension Year: CustomStringConvertible {
4356
public var description: String {
4457
rawValue.description

Tests/SwiftYMDTests/MonthTests.swift

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import XCTest
2+
import SwiftYMD
3+
4+
class MonthTests: XCTestCase {
5+
func testCodable() {
6+
do { // encoding
7+
let month: Month = .december
8+
let data: Data = try JSONEncoder().encode(month)
9+
XCTAssertEqual(String(data: data, encoding: .utf8)!, "\"December\"")
10+
} catch {
11+
XCTFail("\(error)")
12+
}
13+
14+
do { // decoding
15+
let data: Data = "\"December\"".data(using: .utf8)!
16+
let month: Month = try JSONDecoder().decode(Month.self, from: data)
17+
XCTAssertEqual(month, .december)
18+
} catch {
19+
XCTFail("\(error)")
20+
}
21+
}
22+
}

Tests/SwiftYMDTests/XCTestManifests.swift

+11
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@ extension FoundationTests {
1010
]
1111
}
1212

13+
extension MonthTests {
14+
// DO NOT MODIFY: This is autogenerated, use:
15+
// `swift test --generate-linuxmain`
16+
// to regenerate.
17+
static let __allTests__MonthTests = [
18+
("testCodable", testCodable),
19+
]
20+
}
21+
1322
extension SwiftYMDTests {
1423
// DO NOT MODIFY: This is autogenerated, use:
1524
// `swift test --generate-linuxmain`
@@ -50,6 +59,7 @@ extension YearTests {
5059
// `swift test --generate-linuxmain`
5160
// to regenerate.
5261
static let __allTests__YearTests = [
62+
("testCodable", testCodable),
5363
("testIsLeapYear", testIsLeapYear),
5464
("testNumberOfDays", testNumberOfDays),
5565
("testOperators", testOperators),
@@ -59,6 +69,7 @@ extension YearTests {
5969
public func __allTests() -> [XCTestCaseEntry] {
6070
return [
6171
testCase(FoundationTests.__allTests__FoundationTests),
72+
testCase(MonthTests.__allTests__MonthTests),
6273
testCase(SwiftYMDTests.__allTests__SwiftYMDTests),
6374
testCase(YMDTests.__allTests__YMDTests),
6475
testCase(YMTests.__allTests__YMTests),

Tests/SwiftYMDTests/YearTests.swift

+18
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,24 @@ class YearTests: XCTestCase {
5454
XCTAssertEqual((2105 as Year).numberOfDays, 365)
5555
}
5656

57+
func testCodable() {
58+
do { // encoding
59+
let year: Year = 1988
60+
let data: Data = try JSONEncoder().encode(year)
61+
XCTAssertEqual(String(data: data, encoding: .utf8)!, "1988")
62+
} catch {
63+
XCTFail("\(error)")
64+
}
65+
66+
do { // decoding
67+
let data: Data = "1988".data(using: .utf8)!
68+
let year: Year = try JSONDecoder().decode(Year.self, from: data)
69+
XCTAssertEqual(year, 1988)
70+
} catch {
71+
XCTFail("\(error)")
72+
}
73+
}
74+
5775
func testOperators() {
5876
XCTAssertEqual((1988 as Year) + (31 as Year), (2019 as Year))
5977
do {

0 commit comments

Comments
 (0)