From 02987ad3617691e12aea19e31a281a7b46740668 Mon Sep 17 00:00:00 2001 From: Wiredframe <13737875+Wiredframe@users.noreply.github.com> Date: Thu, 24 Sep 2026 20:52:13 +0200 Subject: [PATCH] Include recurrence rules in JSON output --- .../EKReminder+Encodable.swift | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/Sources/RemindersLibrary/EKReminder+Encodable.swift b/Sources/RemindersLibrary/EKReminder+Encodable.swift index f9f9fdb..bf58625 100644 --- a/Sources/RemindersLibrary/EKReminder+Encodable.swift +++ b/Sources/RemindersLibrary/EKReminder+Encodable.swift @@ -16,6 +16,7 @@ extension EKReminder: @retroactive Encodable { case startDate case dueDate case list + case recurrence } public func encode(to encoder: Encoder) throws { @@ -51,6 +52,11 @@ extension EKReminder: @retroactive Encodable { try container.encodeIfPresent(format(dueDateComponents.date), forKey: .dueDate) } + // e.g. [{"frequency":"weekly","interval":2}] + if let rules = self.recurrenceRules, !rules.isEmpty { + try container.encode(rules.map(RecurrenceRule.init), forKey: .recurrence) + } + if let lastModifiedDate = self.lastModifiedDate { try container.encode(format(lastModifiedDate), forKey: .lastModified) } @@ -68,3 +74,28 @@ extension EKReminder: @retroactive Encodable { } } } + +private struct RecurrenceRule: Encodable { + let frequency: String + let interval: Int + let daysOfWeek: [Int]? + let daysOfMonth: [Int]? + let endDate: String? + let occurrenceCount: Int? + + init(_ rule: EKRecurrenceRule) { + switch rule.frequency { + case .daily: frequency = "daily" + case .weekly: frequency = "weekly" + case .monthly: frequency = "monthly" + case .yearly: frequency = "yearly" + @unknown default: frequency = "unknown" + } + interval = rule.interval + daysOfWeek = rule.daysOfTheWeek?.map { $0.dayOfTheWeek.rawValue } + daysOfMonth = rule.daysOfTheMonth?.map { $0.intValue } + endDate = rule.recurrenceEnd?.endDate.map { ISO8601DateFormatter().string(from: $0) } + let count = rule.recurrenceEnd?.occurrenceCount ?? 0 + occurrenceCount = count > 0 ? count : nil + } +}