use std::marker::PhantomData;
use compio_buf::IoBufMut;
use futures_util::FutureExt;
use crate::{AsyncRead, framed::codec::Decoder, util::Splittable};
pub mod codec;
pub mod frame;
mod read;
mod write;
const CONFIG_POLLED_ERROR: &str = "`Framed` should not be configured after being polled";
const INCONSISTENT_ERROR: &str = "`Framed` is in an inconsistent state";
#[cold]
fn panic_config_polled() -> ! {
panic!("{}", CONFIG_POLLED_ERROR);
}
pub struct Framed<R, W, C, F, In, Out, B = Vec<u8>> {
read_state: read::State<R, B>,
write_state: write::State<W, B>,
codec: C,
framer: F,
types: PhantomData<(In, Out)>,
}
pub type SymmetricFramed<R, W, C, F, T, B = Vec<u8>> = Framed<R, W, C, F, T, T, B>;
impl<R, W, C, F, In, Out, B> Framed<R, W, C, F, In, Out, B> {
pub fn with_reader<Io>(self, reader: Io) -> Framed<Io, W, C, F, In, Out, B> {
Framed {
read_state: self.read_state.with_io(reader),
write_state: self.write_state,
codec: self.codec,
framer: self.framer,
types: PhantomData,
}
}
pub fn with_writer<Io>(self, writer: Io) -> Framed<R, Io, C, F, In, Out, B> {
Framed {
read_state: self.read_state,
write_state: self.write_state.with_io(writer),
codec: self.codec,
framer: self.framer,
types: PhantomData,
}
}
pub fn with_duplex<Io: Splittable>(
self,
io: Io,
) -> Framed<Io::ReadHalf, Io::WriteHalf, C, F, In, Out, B> {
let (read_half, write_half) = io.split();
Framed {
read_state: self.read_state.with_io(read_half),
write_state: self.write_state.with_io(write_half),
codec: self.codec,
framer: self.framer,
types: PhantomData,
}
}
pub fn with_buffer<Buf: IoBufMut>(
self,
read_buffer: Buf,
write_buffer: Buf,
) -> Framed<R, W, C, F, In, Out, Buf> {
Framed {
read_state: self.read_state.with_buf(read_buffer),
write_state: self.write_state.with_buf(write_buffer),
codec: self.codec,
framer: self.framer,
types: PhantomData,
}
}
}
impl<C, F> Framed<(), (), C, F, (), (), ()> {
pub fn new<In, Out>(codec: C, framer: F) -> Framed<(), (), C, F, In, Out> {
Framed {
read_state: read::State::empty(),
write_state: write::State::empty(),
codec,
framer,
types: PhantomData,
}
}
pub fn symmetric<T>(codec: C, framer: F) -> Framed<(), (), C, F, T, T> {
Framed {
read_state: read::State::empty(),
write_state: write::State::empty(),
codec,
framer,
types: PhantomData,
}
}
}