drogue_http_client/
sink.rs

1use core::fmt::Write;
2use heapless::{ArrayLength, Vec};
3
4/// A sink to send HTTP requests to
5pub trait Sink {
6    fn send(&mut self, data: &[u8]) -> Result<usize, ()>;
7}
8
9/// A sink implementation for a buffer.
10impl<N> Sink for Vec<u8, N>
11where
12    N: ArrayLength<u8>,
13{
14    fn send(&mut self, data: &[u8]) -> Result<usize, ()> {
15        self.extend_from_slice(data).map_err(|_| ())?;
16
17        Ok(data.len())
18    }
19}
20
21struct SinkWrapper<'a>(&'a mut dyn Sink);
22
23impl<'a> Write for SinkWrapper<'a> {
24    fn write_str(&mut self, s: &str) -> Result<(), core::fmt::Error> {
25        let buffer = s.as_bytes();
26        let mut pos = 0usize;
27
28        while pos < buffer.len() {
29            match self.0.send(&buffer[pos..]) {
30                Ok(len) => pos += len,
31                Err(_) => return Err(core::fmt::Error),
32            }
33        }
34
35        Ok(())
36    }
37}