1use std::sync::Arc;
7
8use atomr_core::actor::{ActorPath, ActorSystem, Address, RemoteProvider, RemoteRef};
9
10use crate::endpoint_manager::EndpointManager;
11use crate::remote_ref::RemoteActorRefImpl;
12use crate::serialization::SerializerRegistry;
13use crate::system_daemon::RemoteSystemDaemon;
14
15pub struct RemoteActorRefProvider {
17 local_address: Address,
18 local_uid: u64,
19 endpoint_manager: EndpointManager,
20 registry: SerializerRegistry,
21 pub system_daemon: Arc<RemoteSystemDaemon>,
22}
23
24impl RemoteActorRefProvider {
25 pub fn new(
26 local_address: Address,
27 local_uid: u64,
28 endpoint_manager: EndpointManager,
29 registry: SerializerRegistry,
30 system_daemon: Arc<RemoteSystemDaemon>,
31 ) -> Arc<Self> {
32 Arc::new(Self { local_address, local_uid, endpoint_manager, registry, system_daemon })
33 }
34
35 pub fn endpoint_manager(&self) -> &EndpointManager {
36 &self.endpoint_manager
37 }
38
39 pub fn registry(&self) -> &SerializerRegistry {
40 &self.registry
41 }
42
43 pub fn install(self: &Arc<Self>, system: &ActorSystem) {
45 let p: Arc<dyn RemoteProvider> = self.clone();
46 system.set_remote_provider(p);
47 }
48}
49
50impl RemoteProvider for RemoteActorRefProvider {
51 fn local_address(&self) -> &Address {
52 &self.local_address
53 }
54
55 fn resolve(&self, path: &ActorPath) -> Option<Arc<dyn RemoteRef>> {
56 if path.address == self.local_address {
57 return None;
58 }
59 let r = RemoteActorRefImpl::new(
60 path.clone(),
61 self.endpoint_manager.clone(),
62 self.registry.clone(),
63 self.local_uid,
64 );
65 Some(Arc::new(r))
66 }
67}