Cleaning up the api.
This commit is contained in:
@@ -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
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user