41 lines
1.1 KiB
Swift
41 lines
1.1 KiB
Swift
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<T: Decodable>(
|
|
_ 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
|
|
}
|
|
}
|
|
}
|