// // TimelineMarkers.swift // Pachyderm // // Created by Shadowfacts on 2/14/23. // import Foundation public struct TimelineMarkers { private init() {} public static func request(timeline: T) -> Request> { Request(method: .get, path: "/api/v1/markers", queryParameters: ["timeline[]" => T.name]) } public static func update(timeline: T, lastReadID: String) -> Request { Request(method: .post, path: "/api/v1/markers", body: ParametersBody([ "\(T.name)[last_read_id]" => lastReadID ])) } } public struct TimelineMarker: Decodable, Sendable { let payload: Payload public var lastReadID: String { payload.payload.lastReadID } public var version: Int { payload.payload.version } public var updatedAt: Date { payload.payload.updatedAt } public init(from decoder: any Decoder) throws { self.payload = try Payload(from: decoder) } } public protocol TimelineMarkerTypePayload: Decodable, Sendable { var payload: MarkerPayload { get } } public struct HomeMarkerPayload: TimelineMarkerTypePayload { public var home: MarkerPayload public var payload: MarkerPayload { home } } public struct NotificationsMarkerPayload: TimelineMarkerTypePayload { public var notifications: MarkerPayload public var payload: MarkerPayload { notifications } } public struct MarkerPayload: Decodable, Sendable { public let lastReadID: String public let version: Int public let updatedAt: Date enum CodingKeys: String, CodingKey { case lastReadID = "last_read_id" case version case updatedAt = "updated_at" } } public protocol TimelineMarkerType { static var name: String { get } associatedtype Payload: TimelineMarkerTypePayload } extension TimelineMarkerType where Self == HomeMarker { public static var home: Self { .init() } } extension TimelineMarkerType where Self == NotificationsMarker { public static var notifications: Self { .init() } } public struct HomeMarker: TimelineMarkerType { public typealias Payload = HomeMarkerPayload public static var name: String { "home" } } public struct NotificationsMarker: TimelineMarkerType { public typealias Payload = NotificationsMarkerPayload public static var name: String { "notifications" } }