1use crate::io;
2use futures::{Sink, Stream};
3
4#[cfg(feature = "nb")]
5mod reader;
6#[cfg(feature = "nb")]
7pub use reader::Reader;
8
9#[cfg(feature = "nb")]
10mod writer;
11#[cfg(feature = "nb")]
12pub use writer::Writer;
13
14pub trait Serial: SerialRead + SerialWrite {}
15
16impl<T> Serial for T where T: ?Sized + SerialRead + SerialWrite {}
17
18pub trait SerialRead: Stream<Item = Result<u8, Self::Error>> + serial_read::Sealed {
19 type Error;
20
21 fn into_reader(self) -> io::Reader<Self>
22 where
23 Self: Sized + Unpin,
24 {
25 io::reader(self)
26 }
27}
28
29impl<T, E> SerialRead for T
30where
31 T: ?Sized + Stream<Item = Result<u8, E>>,
32{
33 type Error = E;
34}
35
36pub trait SerialWrite: Sink<u8> + serial_write::Sealed {
37 fn into_writer(self) -> io::Writer<Self>
38 where
39 Self: Sized + Unpin,
40 {
41 io::writer(self)
42 }
43}
44
45impl<T> SerialWrite for T where T: ?Sized + Sink<u8> {}
46
47mod serial_read {
48 use super::Stream;
49
50 pub trait Sealed {}
51
52 impl<T, E> Sealed for T where T: ?Sized + Stream<Item = Result<u8, E>> {}
53}
54
55mod serial_write {
56 use super::Sink;
57
58 pub trait Sealed {}
59
60 impl<T> Sealed for T where T: ?Sized + Sink<u8> {}
61}