import Foundation public enum WatchPayloadValidationError: Error, Equatable { case emptyPayload case payloadTooLarge(actualBytes: Int, maxBytes: Int) case decodeFailure } public enum WatchPayloadValidation { public static let defaultMaxPayloadBytes = 256 * 1024 public static func validate(_ payload: Data, maxBytes: Int = defaultMaxPayloadBytes) -> WatchPayloadValidationError? { guard payload.isEmpty == false else { return .emptyPayload } guard payload.count <= maxBytes else { return .payloadTooLarge(actualBytes: payload.count, maxBytes: maxBytes) } return nil } public static func decode( _ type: T.Type, from payload: Data, maxBytes: Int = defaultMaxPayloadBytes, decoder: JSONDecoder = JSONDecoder() ) throws -> T { if let validationError = validate(payload, maxBytes: maxBytes) { throw validationError } do { return try decoder.decode(T.self, from: payload) } catch { throw WatchPayloadValidationError.decodeFailure } } }