rill_engine/actors/engine/
actor.rs1use crate::actors::connector::RillConnector;
2use crate::config::EngineConfig;
4use anyhow::Error;
5use async_trait::async_trait;
6use meio::{Actor, Context, Eliminated, IdOf, InterruptedBy, StartedBy};
7use rill_protocol::io::provider::EntryId;
8use strum::{EnumIter, IntoEnumIterator};
9
10pub struct RillEngine {
12 name: EntryId,
13 config: Option<EngineConfig>,
15}
16
17#[derive(Debug, Clone, PartialEq, Eq, Hash, EnumIter)]
18pub enum Group {
19 Connector,
20 }
22
23impl Actor for RillEngine {
24 type GroupBy = Group;
25
26 fn name(&self) -> String {
27 format!("RillEngine({})", &self.name)
28 }
29}
30
31impl RillEngine {
32 pub fn new(config: EngineConfig) -> Self {
34 let name = config.provider_name();
35 Self {
36 name,
37 config: Some(config),
38 }
39 }
40}
41
42#[async_trait]
43impl<T: Actor> StartedBy<T> for RillEngine {
44 async fn handle(&mut self, ctx: &mut Context<Self>) -> Result<(), Error> {
45 ctx.termination_sequence(Group::iter().collect());
46
47 let config = self.config.take().unwrap();
48 let connector = RillConnector::new(config);
49 ctx.spawn_actor(connector, Group::Connector);
50
51 Ok(())
57 }
58}
59
60#[async_trait]
61impl<T: Actor> InterruptedBy<T> for RillEngine {
62 async fn handle(&mut self, ctx: &mut Context<Self>) -> Result<(), Error> {
63 ctx.shutdown();
64 Ok(())
65 }
66}
67
68#[async_trait]
69impl Eliminated<RillConnector> for RillEngine {
70 async fn handle(
71 &mut self,
72 _id: IdOf<RillConnector>,
73 ctx: &mut Context<Self>,
74 ) -> Result<(), Error> {
75 ctx.shutdown();
76 Ok(())
77 }
78}
79
80