1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use std::io::Read;
use crate::imp::structs::metadata::Metadata;
use crate::ArcResult;
use std::collections::{BTreeMap};
use crate::imp::structs::archive_data::ArchiveData;

pub fn read_archive_data(read : &mut impl Read) -> ArcResult<ArchiveData>{
    let (meta, _size) = Metadata::from_bytes(read)?;
    let mut map : BTreeMap<String, String> = BTreeMap::new();

    let mut decoder = snap::read::FrameDecoder::new(read);

    for item in meta.items(){
        let mut buf = Vec::with_capacity(item.len() as usize);
        unsafe{ buf.set_len(item.len() as usize); }

        decoder.read_exact(&mut buf)?;
        let txt = String::from_utf8(buf)?;
        map.insert(item.file_stem().to_string(), txt);
    }

    Ok(ArchiveData::new(meta, map))
}