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 { public static func buildExpression( _ collection: RouteCollection ) -> [RouteCollection] { [collection] } public static func buildBlock( _ collections: [RouteCollection]... ) -> [RouteCollection] { collections.flatMap { $0 } } public static func buildOptional( _ collections: [RouteCollection]? ) -> [RouteCollection] { collections ?? [] } public static func buildEither( first collections: [RouteCollection] ) -> [RouteCollection] { collections } public static func buildEither( second collections: [RouteCollection] ) -> [RouteCollection] { collections } public static func buildArray( _ collections: [[RouteCollection]] ) -> [RouteCollection] { 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().routes /// HealthController().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 _ build: () -> [RouteCollection] ) -> Self { for collection in build() { addRoutes(collection) } return self } }