Files
swift-aws-lambda-runtime/Examples/ServiceLifecycle+Postgres/Sources/PreludeService.swift
T
Sébastien Stormacq e6ba07fd06 [example] Add example for Swift Service Lifecycle (#522)
Now that task cancellation works, re publishing this PR with a new
example for Swift Service Lifecycle
2025-07-30 06:40:55 +04:00

58 lines
1.9 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftAWSLambdaRuntime open source project
//
// Copyright (c) 2025 Apple Inc. and the SwiftAWSLambdaRuntime project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftAWSLambdaRuntime project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
//===----------------------------------------------------------------------===//
//
// This source file is part of the Hummingbird server framework project
//
// Copyright (c) 2024 the Hummingbird authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See hummingbird/CONTRIBUTORS.txt for the list of Hummingbird authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
// Copied from https://github.com/hummingbird-project/hummingbird/blob/main/Sources/Hummingbird/Utils/PreludeService.swift
import ServiceLifecycle
/// Wrap another service to run after a prelude closure has completed
struct PreludeService<S: Service>: Service, CustomStringConvertible {
let prelude: @Sendable () async throws -> Void
let service: S
var description: String {
"PreludeService<\(S.self)>"
}
init(service: S, prelude: @escaping @Sendable () async throws -> Void) {
self.service = service
self.prelude = prelude
}
func run() async throws {
try await self.prelude()
try await self.service.run()
}
}
extension Service {
/// Build existential ``PreludeService`` from an existential `Service`
func withPrelude(_ prelude: @escaping @Sendable () async throws -> Void) -> Service {
PreludeService(service: self, prelude: prelude)
}
}