leyline-http 0.1.1

HTTP client that mimics browsers on the wire
Documentation
use std::io::Write;

use super::limit::{Cap, Overflow};

pub(super) struct Sink {
    pub(super) buf: Vec<u8>,
    written: usize,
    cap: Cap,
    truncated: bool,
}

impl Sink {
    pub(super) fn new(cap: Cap) -> Self {
        Self {
            buf: Vec::new(),
            written: 0,
            cap,
            truncated: false,
        }
    }

    pub(super) fn truncated(&self) -> bool {
        self.truncated
    }
}

impl Write for Sink {
    fn write(&mut self, data: &[u8]) -> std::io::Result<usize> {
        let room = self.cap.room(self.written);
        self.written = self.written.saturating_add(data.len());
        if data.len() > room {
            if self.cap.overflow == Overflow::Truncate {
                self.buf.extend_from_slice(&data[..room]);
                self.truncated = true;
            }
            return Err(self.cap.limit.into_io());
        }
        self.buf.extend_from_slice(data);
        Ok(data.len())
    }

    fn flush(&mut self) -> std::io::Result<()> {
        Ok(())
    }
}