std_modrpc/role_impls/
stream_sender.rs

1use core::cell::Cell;
2use crate::proto::{StreamInitState, StreamItemGen, StreamSenderConfig};
3use modrpc::RoleSetup;
4use std::rc::Rc;
5
6struct State<T> {
7    hooks: crate::StreamSenderHooks<T>,
8    next_seq: Cell<u64>,
9}
10
11#[derive(Clone)]
12pub struct StreamSender<T> {
13    state: Rc<State<T>>,
14}
15
16impl<T: mproto::Owned> StreamSender<T> {
17    pub async fn send<U>(&mut self, payload: U)
18        where U: mproto::Encode + mproto::Compatible<T>
19    {
20        let seq = self.state.next_seq.get();
21        self.state.next_seq.set(seq + 1);
22
23        self.state.hooks.item.send(StreamItemGen {
24            seq,
25            payload,
26        })
27        .await;
28    }
29}
30
31pub struct StreamSenderBuilder<T> {
32    state: Rc<State<T>>,
33}
34
35impl<T: mproto::Owned> StreamSenderBuilder<T> {
36    pub fn new(
37        _name: &'static str,
38        hooks: crate::StreamSenderHooks<T>,
39        _stubs: crate::StreamSenderStubs<T>,
40        _config: &StreamSenderConfig,
41        _init: StreamInitState,
42    ) -> Self {
43        let state = Rc::new(State {
44            hooks,
45            next_seq: Cell::new(0),
46        });
47        Self { state }
48    }
49
50    pub fn create_handle(
51        &self,
52        _setup: &RoleSetup,
53    ) -> crate::StreamSender<T> {
54        crate::StreamSender { state: self.state.clone() }
55    }
56
57    pub fn build(
58        self,
59        _setup: &RoleSetup,
60    ) {
61    }
62}
63