tinymist_package/pack/
memory.rs

1use std::{collections::HashMap, io::Cursor};
2
3use ecow::EcoString;
4
5use super::*;
6
7/// A package in the directory.
8#[derive(Default, Debug, Clone)]
9pub struct MapPack {
10    /// The files storing the package.
11    pub files: HashMap<EcoString, ImmutBytes>,
12}
13
14impl MapPack {
15    /// Creates a new `MapPack` instance.
16    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}