std_modrpc/role_impls/
stream_sender.rs

1use crate::proto::{StreamInitState, StreamItemGen, StreamSenderConfig};
2use core::cell::Cell;
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
19        U: mproto::Encode + mproto::Compatible<T>,
20    {
21        let seq = self.state.next_seq.get();
22        self.state.next_seq.set(seq + 1);
23
24        self.state
25            .hooks
26            .item
27            .send(StreamItemGen { seq, payload })
28            .await;
29    }
30}
31
32pub struct StreamSenderBuilder<T> {
33    state: Rc<State<T>>,
34}
35
36impl<T: mproto::Owned> StreamSenderBuilder<T> {
37    pub fn new(
38        _name: &'static str,
39        hooks: crate::StreamSenderHooks<T>,
40        _stubs: crate::StreamSenderStubs<T>,
41        _config: &StreamSenderConfig,
42        _init: StreamInitState,
43    ) -> Self {
44        let state = Rc::new(State {
45            hooks,
46            next_seq: Cell::new(0),
47        });
48        Self { state }
49    }
50
51    pub fn create_handle(&self, _setup: &RoleSetup) -> crate::StreamSender<T> {
52        crate::StreamSender {
53            state: self.state.clone(),
54        }
55    }
56
57    pub fn build(self, _setup: &RoleSetup) {}
58}