From e6b3305bae8f5e8cf711c4969eed98608c862fd2 Mon Sep 17 00:00:00 2001 From: Ryan Koval Date: Mon, 8 Aug 2022 23:44:43 -0500 Subject: [PATCH] added support for extra reminder flags --- Sources/RemindersLibrary/CLI.swift | 33 ++++++++++++++++++- .../RemindersLibrary/NaturalLanguage.swift | 11 +++++++ Sources/RemindersLibrary/Reminders.swift | 6 +++- .../RemindersTests/NaturalLanguageTests.swift | 8 +++++ 4 files changed, 56 insertions(+), 2 deletions(-) diff --git a/Sources/RemindersLibrary/CLI.swift b/Sources/RemindersLibrary/CLI.swift index 49a9761..2e52297 100644 --- a/Sources/RemindersLibrary/CLI.swift +++ b/Sources/RemindersLibrary/CLI.swift @@ -71,11 +71,42 @@ private struct AddReminder: ParsableCommand { help: "The date the reminder is due") var dueDate: DateComponents? + @Option( + name: .shortAndLong, + help: "The reminder URL") + var url: URL? + + @Option( + name: .shortAndLong, + help: "The reminder location") + var location: String? + + @Option( + name: .shortAndLong, + help: "The reminder notes") + var notes: String? + + @Option( + name: .shortAndLong, + help: "The reminder priority") + var priority: Int = 0 + + func validate() throws { + guard priority >= 0 && priority <= 9 else { + throw ValidationError("'priority' must be between 0 and 9 (inclusive)") + } + } + func run() { reminders.addReminder( string: self.reminder.joined(separator: " "), toListNamed: self.listName, - dueDate: self.dueDate) + dueDate: self.dueDate, + url: self.url, + notes: self.notes, + priority: self.priority, + location: self.location + ) } } diff --git a/Sources/RemindersLibrary/NaturalLanguage.swift b/Sources/RemindersLibrary/NaturalLanguage.swift index edbf9cb..bb2e7f5 100644 --- a/Sources/RemindersLibrary/NaturalLanguage.swift +++ b/Sources/RemindersLibrary/NaturalLanguage.swift @@ -48,3 +48,14 @@ extension DateComponents: ExpressibleByArgument { } } } + +extension URL: ExpressibleByArgument { + public init?(argument: String) { + if let url = URL(string: argument) { + self = url + } else { + return nil + } + } +} + diff --git a/Sources/RemindersLibrary/Reminders.swift b/Sources/RemindersLibrary/Reminders.swift index 7fb127c..1efb397 100644 --- a/Sources/RemindersLibrary/Reminders.swift +++ b/Sources/RemindersLibrary/Reminders.swift @@ -163,12 +163,16 @@ public final class Reminders { semaphore.wait() } - func addReminder(string: String, toListNamed name: String, dueDate: DateComponents?) { + func addReminder(string: String, toListNamed name: String, dueDate: DateComponents?, url: URL?, notes: String?, priority: Int, location: String?) { let calendar = self.calendar(withName: name) let reminder = EKReminder(eventStore: Store) reminder.calendar = calendar reminder.title = string reminder.dueDateComponents = dueDate + reminder.url = url + reminder.notes = notes + reminder.priority = priority + reminder.location = location do { try Store.save(reminder, commit: true) diff --git a/Tests/RemindersTests/NaturalLanguageTests.swift b/Tests/RemindersTests/NaturalLanguageTests.swift index c71e9c2..4684b11 100644 --- a/Tests/RemindersTests/NaturalLanguageTests.swift +++ b/Tests/RemindersTests/NaturalLanguageTests.swift @@ -65,4 +65,12 @@ final class NaturalLanguageTests: XCTestCase { func testIgnoreRandomString() { XCTAssertNil(DateComponents(argument: "blah tomorrow 9pm")) } + + func testUrl() { + XCTAssertNotNil(URL(string: "https://www.github.com")) + } + + func testUrlWithoutDomain() { + XCTAssertNotNil(URL(string: "www.github.com")) + } }