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}