fast_pull/mem/
pusher.rs

1extern crate alloc;
2use crate::{RandPusher, SeqPusher};
3use alloc::{sync::Arc, vec::Vec};
4use tokio::sync::Mutex;
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 SeqPusher for MemPusher {
23    type Error = ();
24    async fn push(&mut self, content: &[u8]) -> Result<(), Self::Error> {
25        self.receive.lock().await.extend_from_slice(content);
26        Ok(())
27    }
28}
29impl RandPusher for MemPusher {
30    type Error = ();
31    async fn push(
32        &mut self,
33        range: crate::ProgressEntry,
34        content: &[u8],
35    ) -> Result<(), Self::Error> {
36        let mut guard = self.receive.lock().await;
37        if guard.len() < range.end as usize {
38            guard.resize(range.end as usize, 0);
39        }
40        guard[range.start as usize..range.end as usize].copy_from_slice(content);
41        Ok(())
42    }
43}