Skip to main content

aws_multipart_upload/encoder/
lines_encoder.rs

1use std::convert::Infallible;
2
3use bytes::BufMut as _;
4
5use super::PartEncoder;
6use crate::request::{PartBody, PartNumber};
7
8/// `LinesEncoder` implements `Encoder` by writing input items delimited by the
9/// newline character `\n` on all platforms.
10#[derive(Debug, Clone, Default)]
11pub struct LinesEncoder {
12    header: Option<String>,
13}
14
15impl LinesEncoder {
16    /// Creates a new `LinesEncoder` with default values.
17    pub fn new() -> Self {
18        Self::default()
19    }
20
21    /// Write the given header row as the first row of the first part in each
22    /// upload.
23    pub fn with_header<T: Into<String>>(self, header: T) -> Self {
24        Self { header: Some(header.into()) }
25    }
26}
27
28impl<Item: AsRef<str>> PartEncoder<Item> for LinesEncoder {
29    type Error = Infallible;
30
31    fn encode(
32        &mut self,
33        part: &mut PartBody,
34        part_number: PartNumber,
35        item: Item,
36    ) -> Result<(), Self::Error> {
37        let item = item.as_ref().as_bytes();
38        if let Some(header) = self.header.as_ref()
39            && part.is_empty()
40            && part_number.is_first()
41        {
42            let header = header.as_bytes();
43            // header_bytes\nitem_bytes\n
44            part.reserve(item.len() + header.len() + 2);
45            part.put(header);
46            part.put_u8(b'\n');
47        } else {
48            part.reserve(item.len() + 1);
49        }
50        part.put(item);
51        part.put_u8(b'\n');
52        Ok(())
53    }
54}