diff --git a/Library/Sources/Public/AppBuilder.swift b/Library/Sources/Public/AppBuilder.swift deleted file mode 100644 index 2426d2a..0000000 --- a/Library/Sources/Public/AppBuilder.swift +++ /dev/null @@ -1,72 +0,0 @@ -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 { - let router = Router() - - router.addMiddleware { - LogRequestsMiddleware(logger.logLevel) - DocCMiddleware("Resources/Archives") - } - - router.get("/") { _,_ in - "" - } - - return router - } - -} diff --git a/Library/Sources/Public/Builders/AppBuilder.swift b/Library/Sources/Public/Builders/AppBuilder.swift new file mode 100644 index 0000000..749388b --- /dev/null +++ b/Library/Sources/Public/Builders/AppBuilder.swift @@ -0,0 +1,85 @@ +import Hummingbird +import Logging + +/// A type that sets and builds an application that should be ready to run. +public struct AppBuilder { + + // MARK: Properties + + private let appName: String + private let archivesFolder: String + private let environment: Environment + + // MARK: Initialisers + + /// Initialises this type. + /// - Parameters: + /// - appName: A name for the app to build. + /// - archivesFolder: A relative path to the location of the *DocC* archive containers. + public init( + appName: String, + archivesFolder: String + ) { + self.appName = appName + self.archivesFolder = archivesFolder + self.environment = Environment() + } + + // MARK: Functions + + /// Sets and builds a ready-to-use application. + /// + /// The application this function builds have the following features: + /// * proxy requests to any available *DocC* archive container in the `archivesFolder` location; + /// * log any request to any available *DocC* archive container in the application console. + /// + /// - Parameter arguments: A set in input parameters used while building the application. + /// - Returns: A configured, functional application that is ready to use. + public func callAsFunction(_ arguments: some AppArguments) async throws -> some ApplicationProtocol { + let logger = logger(level: arguments.logLevel) + let router = router(logger: logger) + + return Application( + router: router, + configuration: .init( + address: .hostname(arguments.hostname, port: arguments.port), + serverName: appName + ), + logger: logger + ) + } + +} + +// MARK: - Helpers + +private extension AppBuilder { + + // MARK: Type aliases + + typealias AppRequestContext = BasicRequestContext + + // MARK: Functions + + func logger(level: Logger.Level?) -> Logger { + var logger = Logger(label: appName) + + logger.logLevel = level + ?? environment.logLevel.flatMap { Logger.Level(rawValue: $0) ?? .info } + ?? .info + + return logger + } + + func router(logger: Logger) -> Router { + let router = Router() + + router.addMiddleware { + LogRequestsMiddleware(logger.logLevel) + DocCMiddleware(archivesFolder) + } + + return router + } + +}