Initial commit

This commit is contained in:
2025-02-22 10:21:07 +01:00
commit be3245ae39
15 changed files with 547 additions and 0 deletions
@@ -0,0 +1,11 @@
import Hummingbird
extension Environment {
// MARK: Computed
public var logLevel: String? {
self.get("LOG_LEVEL")
}
}
@@ -0,0 +1,9 @@
import ArgumentParser
import Logging
/// Extend `Logger.Level` so it can be used as an argument
#if hasFeature(RetroactiveAttribute)
extension Logger.Level: @retroactive ExpressibleByArgument {}
#else
extension Logger.Level: ExpressibleByArgument {}
#endif
+11
View File
@@ -0,0 +1,11 @@
import Logging
public protocol AppArguments {
// MARK: Properties
var hostname: String { get }
var logLevel: Logger.Level? { get }
var port: Int { get }
}
+69
View File
@@ -0,0 +1,69 @@
import Hummingbird
import Logging
public struct AppBuilder {
// MARK: Properties
private let environment: Environment
private let name: String
// MARK: Initialisers
public init(name: String) {
self.environment = Environment()
self.name = name
}
// MARK: Functions
public func callAsFunction(
_ arguments: some AppArguments
) async throws -> some ApplicationProtocol {
let logger = {
var logger = Logger(label: name)
logger.logLevel = arguments.logLevel
?? environment.logLevel.flatMap { Logger.Level(rawValue: $0) ?? .info }
?? .info
return logger
}()
let router = router(logger: logger)
return Application(
router: router,
configuration: .init(
address: .hostname(arguments.hostname, port: arguments.port),
serverName: name
),
logger: logger
)
}
}
// MARK: - Helpers
private extension AppBuilder {
// MARK: Type aliases
typealias AppRequestContext = BasicRequestContext
// MARK: Functions
func router(logger: Logger) -> Router<AppRequestContext> {
let router = Router()
router.add(middleware: LogRequestsMiddleware(logger.logLevel))
router.get("/") { _,_ in
""
}
return router
}
}