sunset_async/
async_channel.rs1use core::future::poll_fn;
3
4#[allow(unused_imports)]
5use log::{debug, error, info, log, trace, warn};
6
7use embedded_io_async::{ErrorType, Read, Write};
8
9use crate::*;
10use sunset::{ChanData, ChanNum, Result};
11
12pub(crate) struct ChanIO<'g> {
14 num: ChanNum,
15 dt: ChanData,
16 sunset: &'g dyn async_sunset::ChanCore,
17}
18
19impl<'g> ChanIO<'g> {
20 pub(crate) fn new_normal(
25 num: ChanNum,
26 sunset: &'g dyn async_sunset::ChanCore,
27 ) -> Self {
28 Self { num, dt: ChanData::Normal, sunset }
29 }
30
31 pub(crate) fn clone_stderr(&self) -> Self {
32 let mut c = self.clone();
33 c.dt = ChanData::Stderr;
34 c
35 }
36}
37
38impl core::fmt::Debug for ChanIO<'_> {
39 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
40 f.debug_struct("ChanIO")
41 .field("num", &self.num)
42 .field("dt", &self.dt)
43 .finish_non_exhaustive()
44 }
45}
46
47impl ChanIO<'_> {
48 pub async fn until_closed(&self) -> Result<()> {
49 poll_fn(|cx| self.sunset.poll_until_channel_closed(cx, self.num)).await
50 }
51
52 pub async fn term_window_change(
53 &self,
54 winch: sunset::packets::WinChange,
55 ) -> Result<()> {
56 poll_fn(|cx| self.sunset.poll_term_window_change(cx, self.num, &winch)).await
57 }
58}
59
60impl Drop for ChanIO<'_> {
61 fn drop(&mut self) {
62 self.sunset.dec_chan(self.num)
63 }
64}
65
66impl Clone for ChanIO<'_> {
72 fn clone(&self) -> Self {
73 self.sunset.inc_chan(self.num);
74 Self { num: self.num, dt: self.dt, sunset: self.sunset }
75 }
76}
77
78impl ErrorType for ChanIO<'_> {
79 type Error = sunset::Error;
80}
81
82impl Read for ChanIO<'_> {
83 async fn read(&mut self, buf: &mut [u8]) -> Result<usize, sunset::Error> {
84 poll_fn(|cx| self.sunset.poll_read_channel(cx, self.num, self.dt, buf)).await
85 }
86}
87
88impl Write for ChanIO<'_> {
89 async fn write(&mut self, buf: &[u8]) -> Result<usize, sunset::Error> {
90 poll_fn(|cx| self.sunset.poll_write_channel(cx, self.num, self.dt, buf))
91 .await
92 }
93
94 }
98
99#[derive(Debug, Clone)]
117pub struct ChanIn<'g>(ChanIO<'g>);
118
119impl<'g> ChanIn<'g> {
120 pub(crate) fn new(io: ChanIO<'g>) -> Self {
121 io.sunset.inc_read_chan(io.num, io.dt);
122 Self(io)
123 }
124
125 pub async fn until_closed(&self) -> Result<()> {
127 self.0.until_closed().await
128 }
129}
130
131impl Drop for ChanIn<'_> {
132 fn drop(&mut self) {
133 self.0.sunset.dec_read_chan(self.0.num, self.0.dt)
134 }
135}
136
137#[derive(Debug, Clone)]
149pub struct ChanOut<'g>(ChanIO<'g>);
150
151impl<'g> ChanOut<'g> {
152 pub(crate) fn new(io: ChanIO<'g>) -> Self {
153 Self(io)
154 }
155
156 pub async fn until_closed(&self) -> Result<()> {
158 self.0.until_closed().await
159 }
160
161 pub async fn term_window_change(
165 &self,
166 winch: sunset::packets::WinChange,
167 ) -> Result<()> {
168 self.0.term_window_change(winch).await
169 }
170}
171
172#[derive(Debug, Clone)]
191pub struct ChanInOut<'g>(ChanIO<'g>);
192
193impl<'g> ChanInOut<'g> {
194 pub(crate) fn new(io: ChanIO<'g>) -> Self {
195 io.sunset.inc_read_chan(io.num, io.dt);
196 Self(io)
197 }
198
199 pub fn split(&self) -> (ChanIn<'g>, ChanOut<'g>) {
203 (ChanIn::new(self.0.clone()), ChanOut::new(self.0.clone()))
204 }
205
206 pub async fn until_closed(&self) -> Result<()> {
208 self.0.until_closed().await
209 }
210
211 pub async fn term_window_change(
215 &self,
216 winch: sunset::packets::WinChange,
217 ) -> Result<()> {
218 self.0.term_window_change(winch).await
219 }
220}
221
222impl Drop for ChanInOut<'_> {
223 fn drop(&mut self) {
224 self.0.sunset.dec_read_chan(self.0.num, self.0.dt)
225 }
226}
227
228impl ErrorType for ChanInOut<'_> {
229 type Error = sunset::Error;
230}
231
232impl ErrorType for ChanIn<'_> {
233 type Error = sunset::Error;
234}
235
236impl ErrorType for ChanOut<'_> {
237 type Error = sunset::Error;
238}
239
240impl Read for ChanInOut<'_> {
241 async fn read(&mut self, buf: &mut [u8]) -> Result<usize, sunset::Error> {
242 self.0.read(buf).await
243 }
244}
245
246impl Write for ChanInOut<'_> {
247 async fn write(&mut self, buf: &[u8]) -> Result<usize, sunset::Error> {
248 self.0.write(buf).await
249 }
250}
251
252impl Read for ChanIn<'_> {
253 async fn read(&mut self, buf: &mut [u8]) -> Result<usize, sunset::Error> {
254 self.0.read(buf).await
255 }
256}
257
258impl Write for ChanOut<'_> {
259 async fn write(&mut self, buf: &[u8]) -> Result<usize, sunset::Error> {
260 self.0.write(buf).await
261 }
262}