1use std::marker::PhantomData;
4
5use serde::{de::DeserializeOwned, Serialize};
6
7use crate::Channel;
8
9#[macro_export]
12macro_rules! pipe {
13 (send $t: ty) => {
14 $crate::type_iter::TypeIter<$crate::type_iter::Tx<$t>>
15 };
16 (receive $t: ty) => {
17 $crate::type_iter::TypeIter<$crate::type_iter::Rx<$t>>
18 };
19 (send $t: ty) => {
20 $crate::type_iter::TypeIter<$crate::type_iter::Tx<$t>>
21 };
22 (receive $t: ty) => {
23 $crate::type_iter::TypeIter<$crate::type_iter::Rx<$t>>
24 };
25
26 (send $t: ty, $($lit: ident $s: ty),*) => {
27 $crate::type_iter::TypeIter<$crate::type_iter::Tx<$t>, $crate::pipe!($($lit $s),*)>
28 };
29 (receive $t: ty, $($lit: ident $s: ty),*) => {
30 $crate::type_iter::TypeIter<$crate::type_iter::Rx<$t>, $crate::pipe!($($lit $s),*)>
31 };
32 (send $t: ty, $($lit: ident $s: ty),*) => {
33 $crate::type_iter::TypeIter<$crate::type_iter::Tx<$t>, $crate::pipe!($($lit $s),*)>
34 };
35 (receive $t: ty, $($lit: ident $s: ty),*) => {
36 $crate::type_iter::TypeIter<$crate::type_iter::Rx<$t>, $crate::pipe!($($lit $s),*)>
37 };
38}
39
40#[macro_export]
46macro_rules! send {
47 ($i: ident, $e: expr) => {
48 #[allow(unused_variables)] let $i = $i.send($e).await?;
50 };
51}
52
53#[macro_export]
59macro_rules! receive {
60 ($i: ident, $e: ident) => {
61 let ($i, $e) = $e.receive().await?;
62 #[allow(unused_variables)] let $e = $e;
64 };
65}
66
67#[macro_export]
79macro_rules! pipeline {
80 () => {};
81 (
82 $v: vis pipeline $i: ident {
83 $($lit: ident $s: ty),*
84 $(,)?
85 }
86 ) => {
87 $v struct $i;
88 impl $crate::type_iter::Pipeline for $i {
89 type Pipe = $crate::pipe!($($lit $s),*);
90 }
91 };
92}
93
94pub trait TypeIterT {
96 type Next;
98 type Type;
100}
101
102impl TypeIterT for () {
103 type Next = ();
104 type Type = ();
105}
106
107#[derive(Default)]
108pub struct TypeIter<T, L = ()>(PhantomData<T>, PhantomData<L>);
110impl<T, L: TypeIterT> TypeIterT for TypeIter<T, L> {
111 type Next = L;
112 type Type = T;
113}
114
115pub trait Transmit {
117 type Type;
119}
120pub trait Receive {
122 type Type;
124}
125
126impl<T> Transmit for Tx<T> {
127 type Type = T;
128}
129impl<T> Receive for Rx<T> {
130 type Type = T;
131}
132
133pub struct Tx<T>(T);
135pub struct Rx<T>(T);
137
138pub trait Pipeline {
140 type Pipe: TypeIterT;
142}
143
144impl Pipeline for () {
145 type Pipe = ();
146}
147
148pub trait Str {}
150impl Str for Tx<String> {}
151impl Str for Tx<&str> {}
152
153pub trait Slice<T> {}
155impl<T> Slice<T> for Tx<&[T]> {}
156impl<T> Slice<T> for Tx<Vec<T>> {}
157
158pub struct MainChannel<T: TypeIterT>(pub(crate) PhantomData<T>, pub(crate) Channel);
160
161impl<T: TypeIterT> MainChannel<T> {
162 pub fn new<P: Pipeline>(chan: Channel) -> MainChannel<P::Pipe> {
164 MainChannel(PhantomData, chan)
165 }
166 pub async fn send(
168 mut self,
169 obj: <T::Type as Transmit>::Type,
170 ) -> crate::Result<MainChannel<T::Next>>
171 where
172 T::Type: Transmit,
173 <T as TypeIterT>::Next: TypeIterT,
174 <<T as TypeIterT>::Type as Transmit>::Type: Serialize + Send,
175 {
176 self.1.send(obj).await?;
177 Ok(MainChannel(PhantomData, self.1))
178 }
179 pub async fn receive(
181 mut self,
182 ) -> crate::Result<(<T::Type as Receive>::Type, MainChannel<T::Next>)>
183 where
184 T::Type: Receive,
185 <T as TypeIterT>::Next: TypeIterT,
186 <T::Type as Receive>::Type: DeserializeOwned,
187 {
188 let res = self.1.receive::<<T::Type as Receive>::Type>().await?;
189 let chan = MainChannel(PhantomData, self.1);
190 Ok((res, chan))
191 }
192 pub fn coerce(self) -> Channel {
194 self.1
195 }
196 pub async fn send_str(mut self, obj: &str) -> crate::Result<MainChannel<T::Next>>
199 where
200 T::Type: Transmit + Str,
201 <T as TypeIterT>::Next: TypeIterT,
202 <<T as TypeIterT>::Type as Transmit>::Type: Serialize + Send,
203 {
204 self.1.send(obj).await?;
205 Ok(MainChannel(PhantomData, self.1))
206 }
207
208 pub async fn send_slice(mut self, obj: &[T::Type]) -> crate::Result<MainChannel<T::Next>>
211 where
212 T::Type: Transmit + Slice<T::Type> + Serialize,
213 <T as TypeIterT>::Next: TypeIterT,
214 <<T as TypeIterT>::Type as Transmit>::Type: Serialize + Send,
215 {
216 self.1.send(obj).await?;
217 Ok(MainChannel(PhantomData, self.1))
218 }
219}
220
221pub struct PeerChannel<T: TypeIterT>(pub(crate) PhantomData<T>, pub(crate) Channel);
223
224impl<T: TypeIterT> PeerChannel<T> {
225 pub fn new<P: Pipeline>(chan: Channel) -> PeerChannel<P::Pipe>
227 where
228 <P as Pipeline>::Pipe: TypeIterT,
229 {
230 PeerChannel(PhantomData, chan)
231 }
232 pub async fn send(
234 mut self,
235 obj: <T::Type as Receive>::Type,
236 ) -> crate::Result<PeerChannel<T::Next>>
237 where
238 T::Type: Receive,
239 <T as TypeIterT>::Next: TypeIterT,
240 <<T as TypeIterT>::Type as Receive>::Type: Serialize + Send,
241 {
242 self.1.send(obj).await?;
243 Ok(PeerChannel(PhantomData, self.1))
244 }
245
246 pub async fn receive(
248 mut self,
249 ) -> crate::Result<(<T::Type as Transmit>::Type, PeerChannel<T::Next>)>
250 where
251 T::Type: Transmit,
252 <T as TypeIterT>::Next: TypeIterT,
253 <T::Type as Transmit>::Type: DeserializeOwned + 'static,
254 {
255 let res = self.1.receive::<<T::Type as Transmit>::Type>().await?;
256 let chan = PeerChannel(PhantomData, self.1);
257 Ok((res, chan))
258 }
259 pub fn channel(self) -> Channel {
261 self.1
262 }
263 pub async fn send_str(mut self, obj: &str) -> crate::Result<PeerChannel<T::Next>>
266 where
267 T::Type: Transmit + Str,
268 <T as TypeIterT>::Next: TypeIterT,
269 <<T as TypeIterT>::Type as Transmit>::Type: Serialize + Send,
270 {
271 self.1.send(obj).await?;
272 Ok(PeerChannel(PhantomData, self.1))
273 }
274 pub async fn send_slice(mut self, obj: &[T::Type]) -> crate::Result<PeerChannel<T::Next>>
277 where
278 T::Type: Transmit + Slice<T::Type> + Serialize,
279 <T as TypeIterT>::Next: TypeIterT,
280 <<T as TypeIterT>::Type as Transmit>::Type: Serialize + Send,
281 {
282 self.1.send(obj).await?;
283 Ok(PeerChannel(PhantomData, self.1))
284 }
285}