import Foundation public enum EquipmentMeasurement: Equatable { case airHandler(AirHandler) case furnaceAndCoil(FurnaceAndCoil) public var equipmentType: EquipmentType { switch self { case .airHandler: return .airHandler case .furnaceAndCoil: return .furnaceAndCoil } } public var externalStaticPressure: Double { switch self { case let .airHandler(airHandler): return airHandler.externalStaticPressure case let .furnaceAndCoil(furnaceAndCoil): return furnaceAndCoil.externalStaticPressure } } public struct AirHandler: Equatable { @Positive public var airflow: Double? @Positive public var returnPlenumPressure: Double? @Positive public var postFilterPressure: Double? @Positive public var postCoilPressure: Double? @Positive public var supplyPlenumPressure: Double? public init( airflow: Double? = nil, returnPlenumPressure: Double? = nil, postFilterPressure: Double? = nil, postCoilPressure: Double? = nil, supplyPlenumPressure: Double? = nil ) { self.airflow = airflow self.returnPlenumPressure = returnPlenumPressure self.postFilterPressure = postFilterPressure self.postCoilPressure = postCoilPressure self.supplyPlenumPressure = supplyPlenumPressure } public var externalStaticPressure: Double { ($returnPlenumPressure.positiveValue ?? 0) + ($supplyPlenumPressure.positiveValue ?? 0) } } public struct FurnaceAndCoil: Equatable { @Positive public var airflow: Double? @Positive public var returnPlenumPressure: Double? @Positive public var postFilterPressure: Double? @Positive public var preCoilPressure: Double? @Positive public var supplyPlenumPressure: Double? public init( airflow: Double? = nil, returnPlenumPressure: Double? = nil, postFilterPressure: Double? = nil, preCoilPressure: Double? = nil, supplyPlenumPressure: Double? = nil ) { self.airflow = airflow self.returnPlenumPressure = returnPlenumPressure self.postFilterPressure = postFilterPressure self.preCoilPressure = preCoilPressure self.supplyPlenumPressure = supplyPlenumPressure } public var externalStaticPressure: Double { ($postFilterPressure.positiveValue ?? 0) + ($preCoilPressure.positiveValue ?? 0) } } } extension EquipmentMeasurement.AirHandler { public enum Key: String, Equatable, CaseIterable { case returnPlenumPressure case postFilterPressure case postCoilPressure case supplyPlenumPressure case airflow } } extension EquipmentMeasurement.FurnaceAndCoil { public enum Key: String, Equatable, CaseIterable { case returnPlenumPressure case postFilterPressure case preCoilPressure case supplyPlenumPressure case airflow } }