108 lines
2.5 KiB
Swift
108 lines
2.5 KiB
Swift
import CasePaths
|
|
import PsychrometricClient
|
|
@preconcurrency import URLRouting
|
|
|
|
public enum Psychrometrics {
|
|
|
|
public static let description = """
|
|
Calculate the psychrometric properties of air based on temperature and humidity readings.
|
|
"""
|
|
|
|
public struct Request: Codable, Equatable, Sendable, Hashable {
|
|
|
|
// public let mode: Mode
|
|
public let temperature: Double
|
|
public let humidity: Double
|
|
public let altitude: Double?
|
|
|
|
public init(temperature: Double, humidity: Double, altitude: Double? = nil) {
|
|
self.temperature = temperature
|
|
self.humidity = humidity
|
|
self.altitude = altitude
|
|
}
|
|
|
|
public enum FieldKey: String {
|
|
case temperature
|
|
case humidity
|
|
case altitude
|
|
}
|
|
}
|
|
|
|
public struct Response: Codable, Equatable, Sendable {
|
|
public let properties: PsychrometricProperties
|
|
public let warnings: [String]
|
|
|
|
public init(properties: PsychrometricProperties, warnings: [String]) {
|
|
self.properties = properties
|
|
self.warnings = warnings
|
|
}
|
|
}
|
|
}
|
|
|
|
// MARK: - Router
|
|
|
|
public extension SiteRoute.View {
|
|
|
|
enum Psychrometrics: Equatable, Sendable, Hashable {
|
|
|
|
case index
|
|
case submit(Routes.Psychrometrics.Request)
|
|
|
|
typealias Key = Routes.Psychrometrics.Request.FieldKey
|
|
static let rootPath = "psychrometric-properties"
|
|
|
|
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.temperature) {
|
|
Double.parser()
|
|
}
|
|
Field(Key.humidity) {
|
|
Double.parser()
|
|
}
|
|
Optionally {
|
|
Field(Key.altitude) {
|
|
Double.parser()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.map(.memberwise(Routes.Psychrometrics.Request.init))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#if DEBUG
|
|
public extension Psychrometrics.Response {
|
|
static let mock = Self(
|
|
properties: .init(
|
|
absoluteHumidity: 91.4,
|
|
atmosphericPressure: 0.3,
|
|
degreeOfSaturation: 0.66,
|
|
density: 0.07,
|
|
dewPoint: 64.3,
|
|
dryBulb: 76,
|
|
enthalpy: 32.33,
|
|
grainsOfMoisture: 91.4,
|
|
humidityRatio: 0.01,
|
|
relativeHumidity: 67,
|
|
specificVolume: 13.78,
|
|
vaporPressure: 0.3,
|
|
wetBulb: 67.7,
|
|
units: .imperial
|
|
),
|
|
warnings: [
|
|
"Test warning."
|
|
]
|
|
)
|
|
}
|
|
#endif
|