1use std::marker::PhantomData;
7
8use futures_util::FutureExt;
9
10use crate::{AsyncRead, buffer::Buffer, framed::codec::Decoder, util::Splittable};
11
12pub mod codec;
13pub mod frame;
14
15mod read;
16mod write;
17
18pub struct Framed<R, W, C, F, In, Out> {
25 read_state: read::State<R>,
26 write_state: write::State<W>,
27 codec: C,
28 framer: F,
29 types: PhantomData<(In, Out)>,
30}
31
32pub type SymmetricFramed<R, W, C, F, Item> = Framed<R, W, C, F, Item, Item>;
34
35impl<R, W, C, F, In, Out> Framed<R, W, C, F, In, Out> {
36 pub fn with_reader<Io>(self, reader: Io) -> Framed<Io, W, C, F, In, Out> {
38 Framed {
39 read_state: read::State::Idle(Some((reader, Buffer::with_capacity(64)))),
40 write_state: self.write_state,
41 codec: self.codec,
42 framer: self.framer,
43 types: PhantomData,
44 }
45 }
46
47 pub fn with_writer<Io>(self, writer: Io) -> Framed<R, Io, C, F, In, Out> {
49 Framed {
50 read_state: self.read_state,
51 write_state: write::State::Idle(Some((writer, Vec::new()))),
52 codec: self.codec,
53 framer: self.framer,
54 types: PhantomData,
55 }
56 }
57
58 pub fn with_duplex<Io: Splittable>(
64 self,
65 io: Io,
66 ) -> Framed<Io::ReadHalf, Io::WriteHalf, C, F, In, Out> {
67 let (read_half, write_half) = io.split();
68
69 Framed {
70 read_state: read::State::Idle(Some((read_half, Buffer::with_capacity(64)))),
71 write_state: write::State::Idle(Some((write_half, Vec::new()))),
72 codec: self.codec,
73 framer: self.framer,
74 types: PhantomData,
75 }
76 }
77}
78
79impl<C, F> Framed<(), (), C, F, (), ()> {
80 pub fn new<In, Out>(codec: C, framer: F) -> Framed<(), (), C, F, In, Out> {
83 Framed {
84 read_state: read::State::Idle(None),
85 write_state: write::State::Idle(None),
86 codec,
87 framer,
88 types: PhantomData,
89 }
90 }
91
92 pub fn symmetric<T>(codec: C, framer: F) -> Framed<(), (), C, F, T, T> {
95 Framed {
96 read_state: read::State::Idle(None),
97 write_state: write::State::Idle(None),
98 codec,
99 framer,
100 types: PhantomData,
101 }
102 }
103}