47 lines
1.5 KiB
Swift
47 lines
1.5 KiB
Swift
import Foundation
|
|
import MacToolsPluginKit
|
|
|
|
struct CalendarHolidayProvider {
|
|
private typealias RawData = [String: [String: Int]]
|
|
|
|
static let empty = CalendarHolidayProvider(records: [:])
|
|
|
|
private let records: [String: [String: CalendarHolidayKind]]
|
|
|
|
init(data: Data) throws {
|
|
let rawData = try JSONDecoder().decode(RawData.self, from: data)
|
|
self.records = rawData.mapValues { days in
|
|
days.reduce(into: [String: CalendarHolidayKind]()) { result, item in
|
|
result[item.key] = CalendarHolidayKind(rawValue: item.value)
|
|
}
|
|
}
|
|
}
|
|
|
|
private init(records: [String: [String: CalendarHolidayKind]]) {
|
|
self.records = records
|
|
}
|
|
|
|
@MainActor
|
|
static func bundled(context: PluginRuntimeContext) -> CalendarHolidayProvider {
|
|
guard let url = context.resourceURL(forResource: "ChinaHolidayOverrides", withExtension: "json") else {
|
|
return .empty
|
|
}
|
|
|
|
do {
|
|
let data = try Data(contentsOf: url)
|
|
return try CalendarHolidayProvider(data: data)
|
|
} catch {
|
|
return .empty
|
|
}
|
|
}
|
|
|
|
func kind(for date: Date, calendar: Calendar) -> CalendarHolidayKind? {
|
|
let components = calendar.dateComponents([.year, .month, .day], from: date)
|
|
guard let year = components.year, let month = components.month, let day = components.day else {
|
|
return nil
|
|
}
|
|
|
|
return records[String(year)]?[String(format: "%02d%02d", month, day)]
|
|
}
|
|
}
|