Skip to content

Commit 8b89a6f

Browse files
committed
✨ Support ISO dates
1 parent eb9c56a commit 8b89a6f

File tree

3 files changed

+31
-10
lines changed

3 files changed

+31
-10
lines changed

Sources/Cli/Hours.swift

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,11 @@ struct Hours: ParsableCommand {
2323
var expression: String
2424

2525
mutating func run() throws {
26-
let parser = DateParser(rules: EN.all + Common.all)
2726
var userDate: Date
28-
do {
29-
let result = try parser.parse(text: expression, base: Date())
30-
userDate = result.date
31-
} catch {
27+
if let date = DateArgument.parse(s: expression) {
28+
userDate = date
29+
} else {
30+
// try natural date parsing
3231
StdErr.print("Can't parse date")
3332
throw ExitCode.failure
3433
}

Sources/Cli/On.swift

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,11 @@ struct On: ParsableCommand {
2525
var expression: String
2626

2727
mutating func run() throws {
28-
let parser = DateParser(rules: EN.all + Common.all)
2928
var userDate: Date
30-
do {
31-
let result = try parser.parse(text: expression, base: Date())
32-
userDate = result.date
33-
} catch {
29+
if let date = DateArgument.parse(s: expression) {
30+
userDate = date
31+
} else {
32+
// try natural date parsing
3433
StdErr.print("Can't parse date")
3534
throw ExitCode.failure
3635
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import Foundation
2+
import when
3+
4+
enum DateArgument {
5+
static func parse(s: String) -> Date? {
6+
let parser = DateParser(rules: EN.all + Common.all)
7+
do {
8+
let formatter = DateFormatter()
9+
formatter.dateFormat = "yyyy-MM-dd"
10+
// try iso date formatting manually
11+
// until swift-when supports iso dates/time
12+
if let date = formatter.date(from: s) {
13+
return date
14+
} else {
15+
// try natural date parsing
16+
let result = try parser.parse(text: s, base: Date())
17+
return result.date
18+
}
19+
} catch {
20+
return nil
21+
}
22+
}
23+
}

0 commit comments

Comments
 (0)