tinymist_package/registry/
memory.rs

1//! Package registry implementation in memory, which could be used in no-std
2//! environments, for example, in a typst plugin.
3
4use std::collections::HashMap;
5use std::path::{Path, PathBuf};
6use std::sync::Arc;
7
8use super::{PackageError, PackageRegistry, PackageSpec};
9
10/// Creates a memory package registry from the builder.
11#[derive(Default, Debug)]
12pub struct MemoryRegistry(HashMap<PackageSpec, Arc<Path>>);
13
14impl MemoryRegistry {
15    /// Adds a memory package.
16    pub fn add_memory_package(&mut self, spec: PackageSpec) -> Arc<Path> {
17        let package_root: Arc<Path> = PathBuf::from("/internal-packages")
18            .join(spec.name.as_str())
19            .join(spec.version.to_string())
20            .into();
21
22        self.0.insert(spec, package_root.clone());
23
24        package_root
25    }
26}
27
28impl PackageRegistry for MemoryRegistry {
29    /// Resolves a package.
30    fn resolve(&self, spec: &PackageSpec) -> Result<Arc<Path>, PackageError> {
31        self.0
32            .get(spec)
33            .cloned()
34            .ok_or_else(|| PackageError::NotFound(spec.clone()))
35    }
36}