//===----------------------------------------------------------------------===// // // This source file is part of the Swift open source project // // Copyright (c) 2021 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 // // See LICENSE.txt for license information // See CONTRIBUTORS.txt for the list of Swift project authors // // SPDX-License-Identifier: Apache-2.0 // //===----------------------------------------------------------------------===// import Distributed // ==== Fake Transport --------------------------------------------------------- struct ActorAddress: Hashable, Sendable, Codable { let address: String init(parse address : String) { self.address = address } init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() self.address = try container.decode(String.self) } func encode(to encoder: Encoder) throws { var container = encoder.singleValueContainer() try container.encode(self.address) } } final class FakeActorSystem: DistributedActorSystem { typealias ActorID = ActorAddress typealias InvocationDecoder = FakeInvocationDecoder typealias InvocationEncoder = FakeInvocationEncoder typealias SerializationRequirement = Codable func resolve(id: ActorID, as actorType: Act.Type) throws -> Act? where Act: DistributedActor, Act.ID == ActorID { return nil } func assignID(_ actorType: Act.Type) -> ActorID where Act: DistributedActor, Act.ID == ActorID { ActorAddress(parse: "fake://\(actorType)") } func actorReady(_ actor: Act) where Act: DistributedActor, Act.ID == ActorID { } func resignID(_ id: ActorID) { } func makeInvocationEncoder() -> InvocationEncoder { .init() } func remoteCall( on actor: Act, target: RemoteCallTarget, invocation: InvocationDecoder, throwing: Err.Type, returning: Res.Type ) async throws -> Res where Act: DistributedActor, Act.ID == ActorID, Res: SerializationRequirement { throw FakeDistributedSystemError(message: "mock impl") } } struct FakeDistributedSystemError: DistributedActorSystemError { let message: String } // === Sending / encoding ------------------------------------------------- struct FakeInvocationEncoder: DistributedTargetInvocationEncoder { typealias SerializationRequirement = Codable mutating func recordGenericSubstitution(_ type: T.Type) throws {} mutating func recordArgument(_ argument: RemoteCallArgument) throws {} mutating func recordReturnType(_ type: R.Type) throws {} mutating func recordErrorType(_ type: E.Type) throws {} mutating func doneRecording() throws {} } // === Receiving / decoding ------------------------------------------------- class FakeInvocationDecoder : DistributedTargetInvocationDecoder { typealias SerializationRequirement = Codable func decodeGenericSubstitutions() throws -> [Any.Type] { [] } func decodeNextArgument() throws -> Argument { fatalError() } func decodeReturnType() throws -> Any.Type? { nil } func decodeErrorType() throws -> Any.Type? { nil } } @available(SwiftStdlib 5.5, *) typealias DefaultDistributedActorSystem = FakeActorSystem // ==== ------------------------------------------------------------------------ distributed actor DA { typealias ActorSystem = FakeActorSystem distributed func hello(other: DA) {} }