1use crate::{ProgressEntry, Pusher};
2use bytes::Bytes;
3use parking_lot::Mutex;
4use std::{sync::Arc, vec::Vec};
5
6#[derive(Debug, Default, Clone)]
7pub struct MemPusher {
8 pub receive: Arc<Mutex<Vec<u8>>>,
9}
10impl MemPusher {
11 pub fn new() -> Self {
12 Self {
13 receive: Arc::new(Mutex::new(Vec::new())),
14 }
15 }
16 pub fn with_capacity(capacity: usize) -> Self {
17 Self {
18 receive: Arc::new(Mutex::new(Vec::with_capacity(capacity))),
19 }
20 }
21}
22impl Pusher for MemPusher {
23 type Error = ();
24 fn push(&mut self, range: &ProgressEntry, content: Bytes) -> Result<(), (Self::Error, Bytes)> {
25 let mut guard = self.receive.lock();
26 if range.start as usize == guard.len() {
27 guard.extend_from_slice(&content);
28 } else {
29 if guard.len() < range.end as usize {
30 guard.resize(range.end as usize, 0);
31 }
32 guard[range.start as usize..range.end as usize].copy_from_slice(&content);
33 }
34 Ok(())
35 }
36}