codecs/encoding/framing/
newline_delimited.rs

1use bytes::BytesMut;
2use serde::{Deserialize, Serialize};
3use tokio_util::codec::Encoder;
4
5use super::{BoxedFramingError, CharacterDelimitedEncoder};
6
7/// Config used to build a `NewlineDelimitedEncoder`.
8#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq, Eq)]
9pub struct NewlineDelimitedEncoderConfig;
10
11impl NewlineDelimitedEncoderConfig {
12    /// Creates a new `NewlineDelimitedEncoderConfig`.
13    pub fn new() -> Self {
14        Default::default()
15    }
16
17    /// Build the `NewlineDelimitedEncoder` from this configuration.
18    pub fn build(&self) -> NewlineDelimitedEncoder {
19        NewlineDelimitedEncoder::default()
20    }
21}
22
23/// A codec for handling bytes that are delimited by (a) newline(s).
24#[derive(Debug, Clone)]
25pub struct NewlineDelimitedEncoder(CharacterDelimitedEncoder);
26
27impl Default for NewlineDelimitedEncoder {
28    fn default() -> Self {
29        Self(CharacterDelimitedEncoder::new(b'\n'))
30    }
31}
32
33impl Encoder<()> for NewlineDelimitedEncoder {
34    type Error = BoxedFramingError;
35
36    fn encode(&mut self, _: (), buffer: &mut BytesMut) -> Result<(), BoxedFramingError> {
37        self.0.encode((), buffer)
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44
45    #[test]
46    fn encode_bytes() {
47        let mut input = BytesMut::from("foo");
48        let mut encoder = NewlineDelimitedEncoder::default();
49
50        encoder.encode((), &mut input).unwrap();
51
52        assert_eq!(input, "foo\n");
53    }
54}