import Foundation /// Ein Fahrzeug. Jedes Profil hat seinen eigenen Satz Geräte; die App zeigt und /// funkt immer nur für das gerade gewählte. struct Profile: Identifiable, Codable, Hashable, Sendable { var id: UUID var name: String /// SF-Symbol für die Auswahl im Dashboard. var symbol: String /// Spurweite in Metern – für die Berechnung der Auffahrkeile quer. var trackWidth: Double? /// Radstand in Metern – dasselbe längs. var wheelbase: Double? init(id: UUID = UUID(), name: String, symbol: String = "suv.side", trackWidth: Double? = nil, wheelbase: Double? = nil) { self.id = id self.name = name self.symbol = symbol self.trackWidth = trackWidth self.wheelbase = wheelbase } /// Profile aus der Zeit vor den Fahrzeugmassen haben noch keine. init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) id = try container.decode(UUID.self, forKey: .id) name = try container.decode(String.self, forKey: .name) symbol = try container.decode(String.self, forKey: .symbol) trackWidth = try container.decodeIfPresent(Double.self, forKey: .trackWidth) wheelbase = try container.decodeIfPresent(Double.self, forKey: .wheelbase) } /// Profil, dem Geräte aus der Zeit vor der Profilverwaltung zugeordnet /// werden. Feste Kennung, damit die Zuordnung beim Update erhalten bleibt. static let defaultID = UUID(uuidString: "00000000-0000-0000-0000-00000000C001")! static var initial: Profile { Profile(id: defaultID, name: "Mein Camper") } /// Auswahl für die Profilbearbeitung. /// Alle Namen gegen NSImage(systemSymbolName:) geprüft – ein nicht /// existierendes Symbol lässt SwiftUI stillschweigend auf Text zurückfallen. static let symbols = [ "car", "car.side", "suv.side", "truck.pickup.side", "box.truck", "bus", ] }