84 lines
2.0 KiB
Swift
84 lines
2.0 KiB
Swift
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<Water>
|
|
public let warnings: [String]
|
|
|
|
public init(pressure: Double, waterDensity: DensityOf<Water>, 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
|