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 framer;
9mod length_delimited;
10mod newline_delimited;
11mod varint_length_delimited;
12
13use std::fmt::Debug;
14
15pub use character_delimited::{
16    CharacterDelimitedEncoder, CharacterDelimitedEncoderConfig, CharacterDelimitedEncoderOptions,
17};
18use dyn_clone::DynClone;
19pub use length_delimited::{LengthDelimitedEncoder, LengthDelimitedEncoderConfig};
20pub use newline_delimited::{NewlineDelimitedEncoder, NewlineDelimitedEncoderConfig};
21use tokio_util::codec::LinesCodecError;
22
23pub use self::{
24    bytes::{BytesEncoder, BytesEncoderConfig},
25    framer::{Framer, FramingConfig},
26    varint_length_delimited::{VarintLengthDelimitedEncoder, VarintLengthDelimitedEncoderConfig},
27};
28
29/// An error that occurred while framing bytes.
30pub trait FramingError: std::error::Error + Send + Sync {}
31
32impl std::error::Error for BoxedFramingError {}
33
34impl FramingError for std::io::Error {}
35
36impl FramingError for LinesCodecError {}
37
38impl From<std::io::Error> for BoxedFramingError {
39    fn from(error: std::io::Error) -> Self {
40        Box::new(error)
41    }
42}
43
44impl From<varint_length_delimited::VarintFramingError> for BoxedFramingError {
45    fn from(error: varint_length_delimited::VarintFramingError) -> Self {
46        Box::new(error)
47    }
48}
49
50/// A `Box` containing a `FramingError`.
51pub type BoxedFramingError = Box<dyn FramingError>;
52
53/// Trait for types that can encode bytes with frame boundaries.
54///
55/// This trait is automatically implemented for any encoder that implements
56/// `tokio_util::codec::Encoder<(), Error = BoxedFramingError>` and the required
57/// trait bounds. It is primarily used for trait objects via the `BoxedFramer` type.
58pub trait FramingEncoder:
59    tokio_util::codec::Encoder<(), Error = BoxedFramingError> + DynClone + Debug + Send + Sync
60{
61}
62
63/// Default implementation of `FramingEncoder` for any type that implements
64/// the required encoder traits.
65impl<Encoder> FramingEncoder for Encoder where
66    Encoder:
67        tokio_util::codec::Encoder<(), Error = BoxedFramingError> + Clone + Debug + Send + Sync
68{
69}
70
71dyn_clone::clone_trait_object!(FramingEncoder);
72
73/// A boxed `FramingEncoder` trait object.
74pub type BoxedFramer = Box<dyn FramingEncoder>;