1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use crate::{ArchiveData, ArcResult};
use std::collections::BTreeMap;
use std::sync::mpsc::{channel, Sender};
use std::io::Write;
use crate::imp::write_items::write_items;
pub fn write_archive<W : Write, T : Send + 'static>(data : &ArchiveData<T>, writer : &mut W) -> ArcResult<()>{
let mut items : BTreeMap<String, Vec<u8>> = BTreeMap::new();
let (sender , receiver) = channel();
for (key,val) in data.btree(){
let key = key.to_string();
let raw_data = val.raw_data().clone();
let sender : Sender<ArcResult<(String, Vec<u8>)>> = sender.clone();
rayon::spawn_fifo(move||{
let mut encoder = snap::raw::Encoder::new();
match encoder.compress_vec(raw_data.as_slice()){
Ok(compressed) => {
sender.send(Ok((key, compressed))).ok();
},
Err(e) =>{
sender.send(Err(e.into())).ok();
}
}
})
}
for _ in 0..data.btree().len(){
let (path, compressed) = receiver.recv()??;
items.insert(path, compressed);
}
write_items(items, writer)
}