feat: Adds hydronic system pressure calculator.
This commit is contained in:
84
Sources/Routes/Models/HydronicSystemPressure.swift
Normal file
84
Sources/Routes/Models/HydronicSystemPressure.swift
Normal file
@@ -0,0 +1,84 @@
|
||||
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
|
||||
Reference in New Issue
Block a user