import Foundation /** A result from sending a key to the device. */ enum MessageResult: UInt8 { /// Text content was received, although binary data was expected case textReceived = 1 /// A socket event on the device was unexpected (not binary data) case unexpectedSocketEvent = 2 /// The size of the payload (i.e. message) was invalid, or the data could not be read case invalidMessageData = 3 /// The transmitted message could not be authenticated using the key case messageAuthenticationFailed = 4 /// The message time was not within the acceptable bounds case messageTimeMismatch = 5 /// A later key has been used, invalidating this key (to prevent replay attacks after blocked communication) case messageCounterInvalid = 6 /// The key was accepted by the device, and the door will be opened case messageAccepted = 7 /// The device produced an unknown error case unknownDeviceError = 9 /// The request did not contain body data with the key case noBodyData = 10 /// The body data could not be read case corruptkeyData = 11 /// The device is not connected case deviceNotConnected = 12 /// The device did not respond within the timeout case deviceTimedOut = 13 /// Another message is being processed by the device case operationInProgress = 14 } extension MessageResult: CustomStringConvertible { var description: String { switch self { case .textReceived: return "The device received unexpected text" case .unexpectedSocketEvent: return "Unexpected socket event for the device" case .invalidMessageData: return "Invalid message data" case .messageAuthenticationFailed: return "Message authentication failed" case .messageTimeMismatch: return "Message time invalid" case .messageCounterInvalid: return "Message counter invalid" case .messageAccepted: return "Message accepted" case .unknownDeviceError: return "The device experienced an unknown error" case .noBodyData: return "No body data included in the request" case .corruptkeyData: return "Key data corrupted" case .deviceNotConnected: return "Device not connected" case .deviceTimedOut: return "The device did not respond" case .operationInProgress: return "Another operation is in progress" } } }