This PR contains the work done to introduce a new Web Swift package that provides a reusable, declarative way to register route controllers on a Hummingbird router, then adopt it in the Website service.
To provide further details about the work:
* Web package
* The `RouterController` protocol — a Sendable protocol to group controllers behind one `routes` property.
* The `RouteCollectionBuilder` — a result builder that collects controllers' route collections into a stack, with full support for optionals, conditionals, and arrays.
* The `addController(_:)` method — a `RouterMethods` extension letting controllers be listed declaratively and adding each one's routes at the router root.
* Website service
* Added Web as a dependency of the _WebsiteLibrary_ target.
* Conformed the `RootController` and `HealthController`controllers to the `RouterController` protocol.
* Updated the `App+Build` extension to to use the cleaner `router.addController { … }` instead.
Reviewed-on: rock-n-code/loud-amsterdam#17
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
47 lines
1.3 KiB
Swift
47 lines
1.3 KiB
Swift
import Hummingbird
|
|
|
|
/// A result builder that collects the route collections of ``RouterController`` values into a stack.
|
|
///
|
|
/// Mirrors the `MiddlewareFixedTypeBuilder` Hummingbird uses for `addMiddleware`, letting
|
|
/// controllers be listed declaratively rather than having their routes added one statement at a time.
|
|
@resultBuilder
|
|
public enum RouteCollectionBuilder<Context: RequestContext> {
|
|
|
|
public static func buildExpression(
|
|
_ controller: some RouterController<Context>
|
|
) -> [RouteCollection<Context>] {
|
|
[controller.routes]
|
|
}
|
|
|
|
public static func buildBlock(
|
|
_ collections: [RouteCollection<Context>]...
|
|
) -> [RouteCollection<Context>] {
|
|
collections.flatMap { $0 }
|
|
}
|
|
|
|
public static func buildOptional(
|
|
_ collections: [RouteCollection<Context>]?
|
|
) -> [RouteCollection<Context>] {
|
|
collections ?? []
|
|
}
|
|
|
|
public static func buildEither(
|
|
first collections: [RouteCollection<Context>]
|
|
) -> [RouteCollection<Context>] {
|
|
collections
|
|
}
|
|
|
|
public static func buildEither(
|
|
second collections: [RouteCollection<Context>]
|
|
) -> [RouteCollection<Context>] {
|
|
collections
|
|
}
|
|
|
|
public static func buildArray(
|
|
_ collections: [[RouteCollection<Context>]]
|
|
) -> [RouteCollection<Context>] {
|
|
collections.flatMap { $0 }
|
|
}
|
|
|
|
}
|