in Sources/DistributedActors/Behaviors.swift [646:699]
func interpretSignal(context: _ActorContext<Message>, signal: Signal) throws -> _Behavior<Message> {
// This switch does not use a `default:` clause on purpose!
// This is to enforce having to consider consider how a signal should be interpreted if a new behavior case is added.
switch self.underlying {
case .stop(let postStop, let reason):
if let postStop = postStop {
return try .stop(postStop: postStop.interpretSignal(context: context, signal: signal), reason: reason)
} else {
return .same
}
case .failed(let behavior, let cause):
return try _Behavior(underlying: .failed(behavior: behavior.interpretSignal(context: context, signal: signal), cause: cause))
case .signalHandling(_, let handleSignal):
return try handleSignal(context, signal)
case .signalHandlingAsync(_, let receiveSignalAsync):
return self.receiveSignalAsync(context: context, signal: signal, handleSignal: receiveSignalAsync)
case .orElse(let first, let second):
let maybeHandled = try first.interpretSignal(context: context, signal: signal)
if maybeHandled.isUnhandled {
return try second.interpretSignal(context: context, signal: signal)
} else {
return maybeHandled
}
case .intercept(let behavior, let interceptor):
return try interceptor.interceptSignal(target: behavior, context: context, signal: signal) // TODO: do we need to try?
case .suspended(let previous, let handler):
let nextBehavior = try previous.interpretSignal(context: context, signal: signal)
if nextBehavior.isTerminal {
return nextBehavior
} else {
return try .suspended(previousBehavior: previous.canonicalize(context, next: nextBehavior), handler: handler)
}
case .receiveMessage, .receive:
return .unhandled
case .receiveMessageAsync, .receiveAsync:
return .unhandled
case .setup:
return .unhandled
case .same:
return .unhandled
case .ignore:
return .unhandled
case .unhandled:
return .unhandled
case .suspend:
return .unhandled
}
}