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