Skip to content

Commit b16b900

Browse files
committed
Gracefully handle situation where TAF group end date comes before start date
1 parent 0442991 commit b16b900

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

Sources/SwiftMETAR/TAF/Parsers/PeriodParser.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,12 @@ class PeriodParser {
7474
let start = try periodStart.parse(match: match, referenceDate: referenceDate, originalString: periodStr),
7575
end = try periodEnd.parse(match: match, referenceDate: referenceDate, afterDate: start, originalString: periodStr)
7676

77+
guard let startDate = start.date,
78+
let endDate = end.date,
79+
endDate >= startDate else {
80+
throw Error.invalidPeriod(periodStr)
81+
}
82+
7783
return .init(start: start, end: end)
7884
}
7985
}

Tests/SwiftMETARTests/TAF/PeriodSpec.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,25 @@ class PeriodSpec: AsyncSpec {
2222
expect(period.end.month).to(equal(4))
2323
expect(period.end.day).to(equal(1))
2424
}
25+
26+
it("throws error for malformed BECMG with end date before start date") {
27+
let string = """
28+
TAF COR SPJL 241715Z 2418/2518 32018KT 9999 BKN020 TX17/2419Z TN04/2510Z TEMPO 2418/2422 32022G35KT SCT020TCU SCT100 BECMG 2423/2224 23007KT FM250300 VRB02KT 9999 SCT020
29+
"""
30+
let referenceDate = Calendar.current.date(from: .init(year: 2025, month: 8, day: 24, hour: 18, minute: 0, second: 0))
31+
32+
await expect {
33+
try await TAF.from(string: string, on: referenceDate)
34+
}.to(throwError { error in
35+
guard let swiftMETARError = error as? SwiftMETAR.Error else {
36+
fail("Expected SwiftMETAR.Error but got \(type(of: error))")
37+
return
38+
}
39+
guard case .invalidPeriod = swiftMETARError else {
40+
fail("Expected .invalidPeriod error but got \(swiftMETARError)")
41+
return
42+
}
43+
})
44+
}
2545
}
2646
}

0 commit comments

Comments
 (0)