import Foundation struct RawBooking: Codable { let id: String; let minutes: Int } enum DecodeFailure: Error { case invalid } func decodeBooking(_ data: Data) throws -> RawBooking { guard data.count <= 1024 else { throw DecodeFailure.invalid } let value = try JSONDecoder().decode(RawBooking.self, from: data) guard !value.id.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty, (1...240).contains(value.minutes) else { throw DecodeFailure.invalid } return value } @main struct Lesson { static func main() { for raw in [#"{"id":"P-31","minutes":45}"#, #"{"id":"P-31","minutes":0}"#, #"{"id":"","minutes":30}"#] { do { let value = try decodeBooking(Data(raw.utf8)); print(value.id, value.minutes) } catch { print("refused") } } } }