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.") } } } }