codecs/encoding/framing/
mod.rs

1//! A collection of framing methods that can be used to convert from byte chunks
2//! to byte frames with defined boundaries.
3
4#![deny(missing_docs)]
5
6mod bytes;
7mod character_delimited;
8mod length_delimited;
9mod newline_delimited;
10
11use std::fmt::Debug;
12
13pub use character_delimited::{
14    CharacterDelimitedEncoder, CharacterDelimitedEncoderConfig, CharacterDelimitedEncoderOptions,
15};
16use dyn_clone::DynClone;
17pub use length_delimited::{LengthDelimitedEncoder, LengthDelimitedEncoderConfig};
18pub use newline_delimited::{NewlineDelimitedEncoder, NewlineDelimitedEncoderConfig};
19use tokio_util::codec::LinesCodecError;
20
21pub use self::bytes::{BytesEncoder, BytesEncoderConfig};
22
23/// An error that occurred while framing bytes.
24pub trait FramingError: std::error::Error + Send + Sync {}
25
26impl std::error::Error for BoxedFramingError {}
27
28impl FramingError for std::io::Error {}
29
30impl FramingError for LinesCodecError {}
31
32impl From<std::io::Error> for BoxedFramingError {
33    fn from(error: std::io::Error) -> Self {
34        Box::new(error)
35    }
36}
37
38/// A `Box` containing a `FramingError`.
39pub type BoxedFramingError = Box<dyn FramingError>;
40
41/// Wrap bytes into a frame.
42pub trait Framer:
43    tokio_util::codec::Encoder<(), Error = BoxedFramingError> + DynClone + Debug + Send + Sync
44{
45}
46
47/// Default implementation for `Framer`s that implement
48/// `tokio_util::codec::Encoder`.
49impl<Encoder> Framer for Encoder where
50    Encoder:
51        tokio_util::codec::Encoder<(), Error = BoxedFramingError> + Clone + Debug + Send + Sync
52{
53}
54
55dyn_clone::clone_trait_object!(Framer);
56
57/// A `Box` containing a `Framer`.
58pub type BoxedFramer = Box<dyn Framer>;