Files
swift-manual-s/Sources/ManualS/Internal/ProposedKWInterpolation.swift
Michael Housh 5b2e20921c
Some checks failed
CI / Ubuntu (push) Failing after 23m10s
feat: Adds proposed kw interpolation.
2025-03-13 12:38:42 -04:00

62 lines
2.0 KiB
Swift

import CoreFoundation
import Models
import Validations
extension ProposedKWInterpolation.Request {
private static let oversizingLimit = 175
func respond() async throws -> ProposedKWInterpolation.Response {
try await validate()
let (requiredKW, optionalHeatPump) = try await requiredKW()
let capacityAsPercentOfLoad = normalizePercentage(proposedKW, requiredKW)
var failures = [String]()
if capacityAsPercentOfLoad > Self.oversizingLimit {
failures.append("Oversizing failure.")
}
return .init(
failures: failures.isEmpty ? nil : failures,
supplementalHeatRequired: requiredKW,
capacityAsPercentOfLoad: capacityAsPercentOfLoad,
oversizingLimit: Self.oversizingLimit,
altitudeAdjustmentMultiplier: optionalHeatPump?.altitudeAdjustmentMultiplier,
balancePointTemperature: optionalHeatPump?.balancePointTemperature,
capacityAtDesign: optionalHeatPump?.capacityAtDesign,
finalCapacity: optionalHeatPump?.finalCapacity
)
}
private var heatPumpRequest: HeatPumpHeatingInterpolation.Request? {
guard let winterDesignTemperature, let climateType, let capacity else {
return nil
}
return .init(
winterDesignTemperature: winterDesignTemperature,
heatLoss: heatLoss,
climateType: climateType,
capacity: capacity
)
}
private func requiredKW() async throws -> (Int, HeatPumpHeatingInterpolation.Response?) {
guard let heatPumpRequest = heatPumpRequest else {
let requiredKW = try await RequiredKW.Request(heatLoss: heatLoss).respond()
return (Int(requiredKW.requiredKW), nil)
}
let heatPumpResponse = try await heatPumpRequest.respond()
return (heatPumpResponse.supplementalHeatRequired, heatPumpResponse)
}
}
extension ProposedKWInterpolation.Request: AsyncValidatable {
public var body: some AsyncValidation<Self> {
AsyncValidator.accumulating {
AsyncValidator.greaterThan(\.heatLoss, 0)
AsyncValidator.greaterThan(\.proposedKW, 0)
}
}
}