p2panda_net/address_book/
supervisor.rs1use ractor::thread_local::{ThreadLocalActor, ThreadLocalActorSpawner};
4use ractor::{ActorCell, SpawnErr};
5
6use crate::address_book::actor::AddressBookActor;
7use crate::address_book::{AddressBook, AddressBookError, Builder};
8use crate::supervisor::{ChildActor, ChildActorFut, Supervisor};
9
10impl Builder {
11 pub async fn spawn_linked(
12 self,
13 supervisor: &Supervisor,
14 ) -> Result<AddressBook, AddressBookError> {
15 let address_book = AddressBook::new(None);
16 supervisor.start_child_actor(address_book.clone()).await?;
17 Ok(address_book)
18 }
19}
20
21impl ChildActor for AddressBook {
22 fn on_start(
23 &self,
24 supervisor: ActorCell,
25 thread_pool: ThreadLocalActorSpawner,
26 ) -> ChildActorFut<'_> {
27 Box::pin(async move {
28 let (actor_ref, _) = AddressBookActor::spawn_linked(
30 None,
31 (self
32 .store()
33 .await
34 .map_err(|err| SpawnErr::StartupFailed(err.into()))?,),
35 supervisor,
36 thread_pool,
37 )
38 .await?;
39
40 let mut inner = self.inner.write().await;
42 inner.actor_ref.replace(actor_ref.clone());
43
44 Ok(actor_ref.into())
45 })
46 }
47}