feat: Adds psi to feet of head conversion.
This commit is contained in:
38
Sources/ApiController/Extensions/FeetOfHead.swift
Normal file
38
Sources/ApiController/Extensions/FeetOfHead.swift
Normal file
@@ -0,0 +1,38 @@
|
||||
import Dependencies
|
||||
import Logging
|
||||
import PsychrometricClient
|
||||
import Routes
|
||||
|
||||
public extension FeetOfHead.Request {
|
||||
|
||||
private static let specificGravity = 1.02
|
||||
|
||||
func respond(logger: Logger) async throws -> FeetOfHead.Response {
|
||||
@Dependency(\.psychrometricClient) var psychrometricClient
|
||||
|
||||
try validate()
|
||||
let waterTemperature = DryBulb.fahrenheit(self.waterTemperature ?? 60)
|
||||
let density = try await psychrometricClient.density.water(waterTemperature)
|
||||
let feetOfHead = pressure / ((density.value / 144) * Self.specificGravity)
|
||||
var warnings = [String]()
|
||||
|
||||
if self.waterTemperature == nil {
|
||||
warnings.append(
|
||||
"Calculations are based on 60°F water temperature."
|
||||
)
|
||||
}
|
||||
|
||||
return .init(feetOfHead: feetOfHead, density: density, warnings: warnings)
|
||||
}
|
||||
|
||||
private func validate() throws {
|
||||
guard pressure > 0 else {
|
||||
throw ValidationError(message: "Pressure should be greater than 0.")
|
||||
}
|
||||
if let waterTemperature {
|
||||
guard waterTemperature > 32 else {
|
||||
throw ValidationError(message: "Water temperature should be above freezing.")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user