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