std_modrpc/role_impls/
stream_sender.rs1use 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}