fix: resolve reminder indexes from show view
Some checks failed
CI / build (push) Has been cancelled

This commit is contained in:
Peter Steinberger 2026-05-08 15:13:00 +01:00
parent de80b37c45
commit 883ae25791
No known key found for this signature in database
7 changed files with 21 additions and 6 deletions

View File

@ -1,6 +1,7 @@
# Changelog
## Unreleased
- Resolve numeric edit/complete/delete indexes against the default `show` view instead of unrelated completed reminders.
- Add a release helper for Homebrew tap updates; thanks @dinakars777.
## 0.2.0 - 2026-05-04

View File

@ -5,18 +5,20 @@ public enum IDResolver {
public static func resolve(
_ inputs: [String],
from reminders: [ReminderItem]
from reminders: [ReminderItem],
numericFrom numericReminders: [ReminderItem]? = nil
) throws -> [ReminderItem] {
let sorted = ReminderFiltering.sort(reminders)
let numericSorted = ReminderFiltering.sort(numericReminders ?? reminders)
var resolved: [ReminderItem] = []
for input in inputs {
let trimmed = input.trimmingCharacters(in: .whitespacesAndNewlines)
if let index = Int(trimmed) {
let idx = index - 1
guard idx >= 0 && idx < sorted.count else {
guard idx >= 0 && idx < numericSorted.count else {
throw RemindCoreError.invalidIdentifier(trimmed)
}
resolved.append(sorted[idx])
resolved.append(numericSorted[idx])
continue
}

View File

@ -42,6 +42,11 @@ enum CommandHelpers {
}
}
static func resolveShowIdentifiers(_ inputs: [String], from reminders: [ReminderItem]) throws -> [ReminderItem] {
let defaultShowReminders = ReminderFiltering.apply(reminders, filter: .today)
return try IDResolver.resolve(inputs, from: reminders, numericFrom: defaultShowReminders)
}
private static func parseCustomRecurrence(_ normalized: String, original: String) throws -> RecurrenceRule {
let parts = normalized.split(separator: " ")
guard parts.count == 3, parts[0] == "every", let interval = Int(parts[1]), interval > 0 else {

View File

@ -32,7 +32,7 @@ enum CompleteCommand {
let store = RemindersStore()
try await store.requestAccess()
let reminders = try await store.reminders(in: nil)
let resolved = try IDResolver.resolve(inputs, from: reminders)
let resolved = try CommandHelpers.resolveShowIdentifiers(inputs, from: reminders)
if values.flag("dryRun") {
OutputRenderer.printReminders(resolved, format: runtime.outputFormat)

View File

@ -33,7 +33,7 @@ enum DeleteCommand {
let store = RemindersStore()
try await store.requestAccess()
let reminders = try await store.reminders(in: nil)
let resolved = try IDResolver.resolve(inputs, from: reminders)
let resolved = try CommandHelpers.resolveShowIdentifiers(inputs, from: reminders)
if values.flag("dryRun") {
OutputRenderer.printReminders(resolved, format: runtime.outputFormat)

View File

@ -57,7 +57,7 @@ enum EditCommand {
let store = RemindersStore()
try await store.requestAccess()
let reminders = try await store.reminders(in: nil)
let resolved = try IDResolver.resolve([input], from: reminders)
let resolved = try CommandHelpers.resolveShowIdentifiers([input], from: reminders)
guard let reminder = resolved.first else {
throw RemindCoreError.reminderNotFound(input)
}

View File

@ -38,6 +38,13 @@ struct IDResolverTests {
#expect(resolved.first?.title == "First")
}
@Test("Resolve numeric indexes from filtered show output")
func resolveIndexFromFilteredShowOutput() throws {
let all = sampleReminders()
let resolved = try IDResolver.resolve(["1"], from: all, numericFrom: [all[1]])
#expect(resolved.first?.title == "Second")
}
@Test("Resolve by prefix")
func resolvePrefix() throws {
let resolved = try IDResolver.resolve(["abcd"], from: sampleReminders())