iOS/Sources/Shared/API/WebSocket/WebSocketMessage.swift
mat1th 97834bfd5e
Update swift lint and format + appy fixes (#2585)
## Summary
Swift lint and swiftformat are outdated. This PR does update those +
applies the new formatting form swiftformat.
There is 1 swift file with a manual change:
`Sources/Vehicle/Templates/Areas/CarPlayAreasViewModel.swift`. This is
done because `swiftlint` did create the following swiftlint error:
`error: Cyclomatic Complexity Violation: Function should have complexity
10 or less; currently complexity is 11 (cyclomatic_complexity)`.

Because it does change a lot of files the question is if we want to
finetune the `swiftformat` rules.

## Screenshots
No user facing changes.

## Link to pull request in Documentation repository
NA

## Any other notes
NA
2024-02-22 13:06:39 +01:00

106 lines
3.6 KiB
Swift

import Foundation
public class WebSocketMessage: Codable {
public let MessageType: String
public var ID: Int?
public var Success: Bool?
public var Payload: [String: Any]?
public var Result: [String: Any]?
public var Message: String?
public var HAVersion: String?
public var command: String?
private enum CodingKeys: String, CodingKey {
case MessageType = "type"
case ID = "id"
case Success = "success"
case Payload = "payload"
case Result = "result"
case Message = "message"
case HAVersion = "ha_version"
case command = "command"
}
public required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
self.MessageType = try values.decode(String.self, forKey: .MessageType)
self.ID = try? values.decode(Int.self, forKey: .ID)
self.Success = try? values.decode(Bool.self, forKey: .Success)
self.Payload = try? values.decode([String: Any].self, forKey: .Payload)
self.Result = try? values.decode([String: Any].self, forKey: .Result)
self.Message = try? values.decode(String.self, forKey: .Message)
self.HAVersion = try? values.decode(String.self, forKey: .HAVersion)
self.command = try values.decodeIfPresent(String.self, forKey: .command)
}
public init?(_ dictionary: [String: Any]) {
guard let mType = dictionary["type"] as? String else {
return nil
}
self.MessageType = mType
self.ID = dictionary["id"] as? Int
self.Payload = dictionary["payload"] as? [String: Any]
self.Result = dictionary["result"] as? [String: Any]
self.Success = dictionary["success"] as? Bool
self.command = dictionary["command"] as? String
}
public init(_ incomingMessage: WebSocketMessage, _ result: [String: Any]) {
self.ID = incomingMessage.ID
self.MessageType = "result"
self.Result = result
self.Success = true
self.command = nil
}
public init(id: Int, type: String, result: [String: Any], success: Bool = true) {
self.ID = id
self.MessageType = type
self.Result = result
self.Success = success
self.command = nil
}
public init(id: Int = -1, command: String, payload: [String: Any]? = nil) {
self.ID = id
self.MessageType = "command"
self.command = command
self.Payload = payload
}
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(MessageType, forKey: .MessageType)
if let ID {
try container.encode(ID, forKey: .ID)
}
if let Success {
try container.encode(Success, forKey: .Success)
}
if let Message {
try container.encode(Message, forKey: .Message)
}
if let Result {
try container.encode(Result, forKey: .Result)
}
if let Payload {
try container.encode(Payload, forKey: .Payload)
}
try container.encodeIfPresent(command, forKey: .command)
}
init(_ messageType: String) {
self.MessageType = messageType
}
}
extension WebSocketMessage: CustomStringConvertible, CustomDebugStringConvertible {
public var description: String {
"WebSocketMessage(type: \(MessageType), id: \(String(describing: ID)), payload: \(String(describing: Payload)), result: \(String(describing: Result)), success: \(String(describing: Success)))"
}
public var debugDescription: String {
description
}
}