libp2p_pubsub_common/service/
context_handles.rs1use std::collections::VecDeque;
2
3pub struct InCtx<'a, InEvent> {
5 inbox: &'a mut VecDeque<InEvent>,
6}
7
8impl<'a, InEvent> InCtx<'a, InEvent> {
9 pub(super) fn new(inbox: &'a mut VecDeque<InEvent>) -> Self {
11 Self { inbox }
12 }
13
14 pub fn len(&self) -> usize {
16 self.inbox.len()
17 }
18
19 pub fn is_empty(&self) -> bool {
21 self.inbox.is_empty()
22 }
23
24 pub fn pop_next(&mut self) -> Option<InEvent> {
26 self.inbox.pop_front()
27 }
28}
29
30pub struct OutCtx<'a, OutEvent> {
32 outbox: &'a mut VecDeque<OutEvent>,
33}
34
35impl<'a, OutEvent> OutCtx<'a, OutEvent> {
36 pub(super) fn new(outbox: &'a mut VecDeque<OutEvent>) -> Self {
38 Self { outbox }
39 }
40
41 pub fn emit(&mut self, ev: OutEvent) {
43 self.outbox.push_back(ev);
44 }
45
46 pub fn emit_batch(&mut self, evs: impl IntoIterator<Item = OutEvent>) {
48 self.outbox.extend(evs);
49 }
50}
51
52pub struct OnEventCtx<'a, OutEvent> {
54 outbox: OutCtx<'a, OutEvent>,
55}
56
57impl<'a, OutEvent> OnEventCtx<'a, OutEvent> {
58 pub fn emit(&mut self, ev: OutEvent) {
60 self.outbox.emit(ev);
61 }
62
63 pub fn emit_batch(&mut self, ev: impl IntoIterator<Item = OutEvent>) {
65 self.outbox.emit_batch(ev);
66 }
67}
68
69impl<'a, OutEvent> From<OutCtx<'a, OutEvent>> for OnEventCtx<'a, OutEvent> {
70 fn from(value: OutCtx<'a, OutEvent>) -> Self {
71 Self { outbox: value }
72 }
73}
74
75pub struct PollCtx<'a, InEvent, OutEvent> {
77 inbox: InCtx<'a, InEvent>,
78 outbox: OutCtx<'a, OutEvent>,
79}
80
81impl<'a, InEvent, OutEvent> PollCtx<'a, InEvent, OutEvent> {
82 pub(super) fn new(
84 inbox: &'a mut VecDeque<InEvent>,
85 outbox: &'a mut VecDeque<OutEvent>,
86 ) -> Self {
87 Self {
88 inbox: InCtx::new(inbox),
89 outbox: OutCtx::new(outbox),
90 }
91 }
92
93 pub fn split(self) -> (InCtx<'a, InEvent>, OutCtx<'a, OutEvent>) {
95 (self.inbox, self.outbox)
96 }
97
98 pub fn len(&self) -> usize {
100 self.inbox.len()
101 }
102
103 pub fn is_empty(&self) -> bool {
105 self.inbox.is_empty()
106 }
107
108 pub fn pop_next(&mut self) -> Option<InEvent> {
110 self.inbox.pop_next()
111 }
112
113 pub fn emit(&mut self, ev: OutEvent) {
115 self.outbox.emit(ev);
116 }
117
118 pub fn emit_batch(&mut self, evs: impl IntoIterator<Item = OutEvent>) {
120 self.outbox.emit_batch(evs);
121 }
122}