import CasePaths import PsychrometricClient @preconcurrency import URLRouting public enum HydronicSystemPressure { public static let description = """ Calculate the required hydronic system pressure based on height of a building. """ public struct Request: Codable, Equatable, Hashable, Sendable { public let height: Double public let waterTemperature: Double? public init(height: Double, waterTemperature: Double? = nil) { self.height = height self.waterTemperature = waterTemperature } public enum FieldKey: String, CaseIterable { case height case waterTemperature } } public struct Response: Codable, Equatable, Sendable { public let pressure: Double public let waterDensity: DensityOf public let warnings: [String] public init(pressure: Double, waterDensity: DensityOf, warnings: [String]) { self.pressure = pressure self.waterDensity = waterDensity self.warnings = warnings } } } // MARK: - Router public extension SiteRoute.View { enum HydronicSystemPressure: Equatable, Hashable, Sendable { case index case submit(Routes.HydronicSystemPressure.Request) typealias Key = Routes.HydronicSystemPressure.Request.FieldKey static let rootPath = "hydronic-system-pressure" public static let router = OneOf { Route(.case(Self.index)) { Path { rootPath } Method.get } Route(.case(Self.submit)) { Path { rootPath } Method.post Body { FormData { Field(Key.height) { Double.parser() } Optionally { Field(Key.waterTemperature) { Double.parser() } } } .map(.memberwise(Routes.HydronicSystemPressure.Request.init)) } } } } } #if DEBUG public extension HydronicSystemPressure.Response { static let mock = Self( pressure: 15, waterDensity: 62.37, warnings: [ "Water density based on 60 water - include water temperature for more accurate result." ] ) } #endif