use std::convert::TryInto;
use std::error::Error as StdError;
use std::fmt;
use std::io::{self, Cursor};
use bytes::{Buf, BufMut, BytesMut};
use tokio::io::{AsyncRead, AsyncWrite};
use tokio_util::codec::{Decoder, Encoder, Framed, FramedRead, FramedWrite};
use flate2::Compress;
use flate2::Compression;
use flate2::Decompress;
use flate2::FlushCompress;
use flate2::FlushDecompress;
/// Builder for the QuasselCodec
#[derive(Debug, Clone, Copy)]
pub struct Builder {
/// Enable or Disable Compression
compression: bool,
/// The level of Compression
compression_level: Compression,
/// Maximum length of the frame
max_frame_len: usize,
}
// An error when the number of bytes read is more than max frame length.
pub struct QuasselCodecError {
_priv: (),
}
/// QuasselCodec provides the base layer of frameing and compression
#[derive(Debug)]
pub struct QuasselCodec {
builder: Builder,
state: DecodeState,
comp: Compress,
decomp: Decompress,
}
#[derive(Debug, Clone, Copy)]
enum DecodeState {
Head,
Data(usize),
}
impl QuasselCodec {
/// Creates a new quassel codec with default values
pub fn new() -> Self {
Self {
builder: Builder::new(),
state: DecodeState::Head,
comp: Compress::new(Compression::default(), true),
decomp: Decompress::new(true),
}
}
/// Creates a new quassel codec builder with default configuration
/// values.
pub fn builder() -> Builder {
Builder::new()
}
/// Gets the maximum frame length
pub fn max_frame_length(&self) -> usize {
self.builder.max_frame_len
}
pub fn compression(&self) -> bool {
self.builder.compression
}
pub fn compression_level(&self) -> Compression {
self.builder.compression_level
}
/// Gets the maximum frame length
pub fn set_max_frame_length(&mut self, val: usize) {
self.builder.max_frame_length(val);
}
pub fn set_compression(&mut self, val: bool) {
self.builder.compression(val);
}
pub fn set_compression_level(&mut self, val: Compression) {
self.builder.compression_level(val);
}
fn decode_head(&mut self, src: &mut BytesMut) -> io::Result