Cleaning up the api.

This commit is contained in:
2021-10-17 15:52:15 -04:00
parent 2ee1f0f1f4
commit 3f78a53014
15 changed files with 551 additions and 202 deletions

View File

@@ -3,30 +3,32 @@ import DewPointEnvironment
import EnvVars
import Logging
import Foundation
import Models
import MQTTNIO
import NIO
/// Sets up the application environment and connections required.
///
/// - Parameters:
/// - eventLoopGroup: The event loop group for the application.
/// - logger: An optional logger for debugging.
public func bootstrap(
eventLoopGroup: EventLoopGroup,
logger: Logger? = nil
) -> EventLoopFuture<DewPointEnvironment> {
logger?.debug("Bootstrapping Dew Point Controller...")
return loadEnvVars(eventLoopGroup: eventLoopGroup, logger: logger)
.map { (envVars) -> DewPointEnvironment in
let mqttClient = MQTTClient(envVars: envVars, eventLoopGroup: eventLoopGroup, logger: logger)
return DewPointEnvironment.init(
client: .live(client: mqttClient),
envVars: envVars,
mqttClient: mqttClient
)
}
.flatMap { environment in
environment.mqttClient.logger.debug("Connecting to MQTT broker...")
return environment.mqttClient.connect()
.map { _ in environment }
}
.makeDewPointEnvironment(eventLoopGroup: eventLoopGroup, logger: logger)
.connectToMQTTBroker(logger: logger)
}
/// Loads the ``EnvVars`` either using the defualts, from a file in the root directory under `.dewPoint-env` or in the shell / application environment.
///
/// - Parameters:
/// - eventLoopGroup: The event loop group for the application.
/// - logger: An optional logger for debugging.
private func loadEnvVars(eventLoopGroup: EventLoopGroup, logger: Logger?) -> EventLoopFuture<EnvVars> {
logger?.debug("Loading env vars...")
@@ -66,6 +68,49 @@ private func loadEnvVars(eventLoopGroup: EventLoopGroup, logger: Logger?) -> Eve
return eventLoopGroup.next().makeSucceededFuture(envVars)
}
extension EventLoopFuture where Value == EnvVars {
/// Creates the ``DewPointEnvironment`` for the application after the ``EnvVars`` have been loaded.
///
/// - Parameters:
/// - eventLoopGroup: The event loop group for the application.
/// - logger: An optional logger for the application.
fileprivate func makeDewPointEnvironment(
eventLoopGroup: EventLoopGroup,
logger: Logger?
) -> EventLoopFuture<DewPointEnvironment> {
map { envVars in
let nioClient = MQTTClient(envVars: envVars, eventLoopGroup: eventLoopGroup, logger: logger)
return DewPointEnvironment.init(
mqttClient: .live(client: nioClient),
envVars: envVars,
nioClient: nioClient,
topics: .init(envVars: envVars)
)
}
}
}
extension EventLoopFuture where Value == DewPointEnvironment {
/// Connects to the MQTT broker after the ``DewPointEnvironment`` has been setup.
///
/// - Parameters:
/// - logger: An optional logger for debugging.
fileprivate func connectToMQTTBroker(logger: Logger?) -> EventLoopFuture<DewPointEnvironment> {
flatMap { environment in
logger?.debug("Connecting to MQTT Broker...")
return environment.nioClient.connect()
.map { _ in
logger?.debug("Successfully connected to MQTT Broker...")
return environment
}
}
}
}
// MARK: - Helpers
extension MQTTClient {
convenience init(envVars: EnvVars, eventLoopGroup: EventLoopGroup, logger: Logger?) {
@@ -83,3 +128,22 @@ extension MQTTClient {
)
}
}
// MARK: - TODO Make topics loadable from a file in the root directory.
extension Topics {
init(envVars: EnvVars) {
self.init(
sensors: .init(
temperature: envVars.temperatureSensor,
humidity: envVars.humiditySensor,
dewPoint: envVars.dewPointTopic
),
relays: .init(
dehumidification1: envVars.dehumidificationStage1Relay,
dehumidification2: envVars.dehumidificationStage2Relay,
humidification: envVars.humidificationRelay
)
)
}
}