p2panda_net/address_book/
supervisor.rs

1// SPDX-License-Identifier: MIT OR Apache-2.0
2
3use 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            // Spawn our actor as a child of the supervisor.
29            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            // Update the reference to our actor, we need this to send messages to it.
41            let mut inner = self.inner.write().await;
42            inner.actor_ref.replace(actor_ref.clone());
43
44            Ok(actor_ref.into())
45        })
46    }
47}