tinymist_package/pack/
memory.rs1use std::{collections::HashMap, io::Cursor};
2
3use ecow::EcoString;
4
5use super::*;
6
7#[derive(Default, Debug, Clone)]
9pub struct MapPack {
10 pub files: HashMap<EcoString, ImmutBytes>,
12}
13
14impl MapPack {
15 pub fn new(files: HashMap<EcoString, ImmutBytes>) -> Self {
17 Self { files }
18 }
19}
20
21impl PackFs for MapPack {
22 fn read_all(
23 &mut self,
24 f: &mut (dyn FnMut(&str, PackFile) -> PackageResult<()> + Send + Sync),
25 ) -> PackageResult<()> {
26 for (path, data) in self.files.iter() {
27 let pack_file = PackFile::Data(Cursor::new(data.clone()));
28 f(path, pack_file)?;
29 }
30
31 Ok(())
32 }
33}
34
35impl Pack for MapPack {}
36impl PackExt for MapPack {}
37
38impl CloneIntoPack for MapPack {
39 fn clone_into_pack(&mut self, pack: &mut impl PackFs) -> std::io::Result<()> {
40 pack.read_all(&mut |path, file| {
41 let data = match file {
42 PackFile::Read(mut reader) => {
43 let mut dst = Vec::new();
44 std::io::copy(&mut reader, &mut dst).map_err(other)?;
45 ImmutBytes::from(dst)
46 }
47 PackFile::Data(data) => data.into_inner(),
48 };
49 self.files.insert(path.into(), data);
50 Ok(())
51 })
52 .map_err(other_io)?;
53 Ok(())
54 }
55}