gloo_worker/actor/
registrar.rs

1use std::fmt;
2use std::marker::PhantomData;
3
4use serde::de::Deserialize;
5use serde::ser::Serialize;
6
7use super::lifecycle::WorkerLifecycleEvent;
8use super::messages::{FromWorker, ToWorker};
9use super::native_worker::{DedicatedWorker, NativeWorkerExt, WorkerSelf};
10use super::scope::WorkerScope;
11use super::traits::Worker;
12use crate::codec::{Bincode, Codec};
13
14/// A Worker Registrar.
15pub struct WorkerRegistrar<W, CODEC = Bincode>
16where
17    W: Worker,
18    CODEC: Codec,
19{
20    _marker: PhantomData<(W, CODEC)>,
21}
22
23impl<W: Worker> fmt::Debug for WorkerRegistrar<W> {
24    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25        f.write_str("WorkerRegistrar<_>")
26    }
27}
28
29impl<W, CODEC> WorkerRegistrar<W, CODEC>
30where
31    W: Worker + 'static,
32    CODEC: Codec,
33{
34    pub(crate) fn new() -> Self {
35        Self {
36            _marker: PhantomData,
37        }
38    }
39
40    /// Sets a new message encoding.
41    pub fn encoding<C>(&self) -> WorkerRegistrar<W, C>
42    where
43        C: Codec,
44    {
45        WorkerRegistrar::new()
46    }
47
48    /// Executes an worker in the current environment.
49    pub fn register(&self)
50    where
51        CODEC: Codec,
52        W::Input: Serialize + for<'de> Deserialize<'de>,
53        W::Output: Serialize + for<'de> Deserialize<'de>,
54    {
55        let scope = WorkerScope::<W>::new::<CODEC>();
56        let upd = WorkerLifecycleEvent::Create(scope.clone());
57        scope.send(upd);
58        let handler = move |msg: ToWorker<W>| {
59            let upd = WorkerLifecycleEvent::Remote(msg);
60            scope.send(upd);
61        };
62        let loaded: FromWorker<W> = FromWorker::WorkerLoaded;
63        let worker = DedicatedWorker::worker_self();
64        worker.set_on_packed_message::<_, CODEC, _>(handler);
65        worker.post_packed_message::<_, CODEC>(loaded);
66    }
67}