81 lines
2.2 KiB
Swift
81 lines
2.2 KiB
Swift
import Hummingbird
|
|||
|
|
|
||
|
|
/// A result builder that collects ``RouteCollection`` values into a stack.
|
||
|
|
///
|
||
|
|
/// Mirrors the `MiddlewareFixedTypeBuilder` Hummingbird uses for `addMiddleware`, letting route
|
||
|
|
/// collections be listed declaratively rather than added one statement at a time.
|
||
|
|
@resultBuilder
|
||
|
|
public enum RouteCollectionBuilder<Context: RequestContext> {
|
||
|
|
|
||
|
|
public static func buildExpression(
|
||
|
|
_ collection: RouteCollection<Context>
|
||
|
|
) -> [RouteCollection<Context>] {
|
||
|
|
[collection]
|
||
|
|
}
|
||
|
|
|
||
|
|
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 }
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
// MARK: - Helpers
|
||
|
|
|
||
|
|
public extension RouterMethods {
|
||
|
|
|
||
|
|
// MARK: Methods
|
||
|
|
|
||
|
|
/// Adds route collections to the router using the ``RouteCollectionBuilder`` result builder.
|
||
|
|
///
|
||
|
|
/// Mirrors `addMiddleware`, letting controllers be listed declaratively:
|
||
|
|
///
|
||
|
|
/// ```swift
|
||
|
|
/// router.addRoutes {
|
||
|
|
/// RootController<AppRequestContext>().routes
|
||
|
|
/// HealthController<AppRequestContext>().routes
|
||
|
|
/// }
|
||
|
|
/// ```
|
||
|
|
///
|
||
|
|
/// Each collection is added at the router's root, exactly as a sequence of
|
||
|
|
/// `addRoutes(_:)` calls would.
|
||
|
|
/// - Parameter build: the route-collection stack result builder.
|
||
|
|
/// - Returns: the router, so calls can be chained.
|
||
|
|
@discardableResult
|
||
|
|
func addRoutes(
|
||
|
|
@RouteCollectionBuilder<Context> _ build: () -> [RouteCollection<Context>]
|
||
|
|
) -> Self {
|
||
|
|
for collection in build() {
|
||
|
|
addRoutes(collection)
|
||
|
|
}
|
||
|
|
|
||
|
|
return self
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|