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;
10mod varint_length_delimited;
11
12use std::fmt::Debug;
13
14pub use character_delimited::{
15    CharacterDelimitedEncoder, CharacterDelimitedEncoderConfig, CharacterDelimitedEncoderOptions,
16};
17use dyn_clone::DynClone;
18pub use length_delimited::{LengthDelimitedEncoder, LengthDelimitedEncoderConfig};
19pub use newline_delimited::{NewlineDelimitedEncoder, NewlineDelimitedEncoderConfig};
20use tokio_util::codec::LinesCodecError;
21
22pub use self::{
23    bytes::{BytesEncoder, BytesEncoderConfig},
24    varint_length_delimited::{VarintLengthDelimitedEncoder, VarintLengthDelimitedEncoderConfig},
25};
26
27/// An error that occurred while framing bytes.
28pub trait FramingError: std::error::Error + Send + Sync {}
29
30impl std::error::Error for BoxedFramingError {}
31
32impl FramingError for std::io::Error {}
33
34impl FramingError for LinesCodecError {}
35
36impl From<std::io::Error> for BoxedFramingError {
37    fn from(error: std::io::Error) -> Self {
38        Box::new(error)
39    }
40}
41
42impl From<varint_length_delimited::VarintFramingError> for BoxedFramingError {
43    fn from(error: varint_length_delimited::VarintFramingError) -> Self {
44        Box::new(error)
45    }
46}
47
48/// A `Box` containing a `FramingError`.
49pub type BoxedFramingError = Box<dyn FramingError>;
50
51/// Wrap bytes into a frame.
52pub trait Framer:
53    tokio_util::codec::Encoder<(), Error = BoxedFramingError> + DynClone + Debug + Send + Sync
54{
55}
56
57/// Default implementation for `Framer`s that implement
58/// `tokio_util::codec::Encoder`.
59impl<Encoder> Framer for Encoder where
60    Encoder:
61        tokio_util::codec::Encoder<(), Error = BoxedFramingError> + Clone + Debug + Send + Sync
62{
63}
64
65dyn_clone::clone_trait_object!(Framer);
66
67/// A `Box` containing a `Framer`.
68pub type BoxedFramer = Box<dyn Framer>;