Skip to main content

wdl_modules/resolver/
types.rs

1//! Value types returned by the [`Resolver`](super::Resolver) trait.
2
3use std::collections::BTreeMap;
4use std::path::PathBuf;
5
6use semver::Version;
7
8use crate::dependency::DependencyName;
9use crate::hash::ContentHash;
10use crate::lockfile::ResolvedSource;
11use crate::signing::VerifyingKey;
12
13/// A symbolic import resolved to a concrete file on disk.
14#[derive(Clone, Debug, PartialEq, Eq)]
15pub struct MaterializedFile {
16    /// Absolute path to the resolved file.
17    pub path: PathBuf,
18    /// Absolute path to the root directory of the module that owns the file.
19    pub module_root: PathBuf,
20    /// The source the file's owning module came from.
21    pub source: ResolvedSource,
22    /// The parsed manifest of the dependency that owns this file.
23    pub manifest: std::sync::Arc<crate::Manifest>,
24}
25
26impl MaterializedFile {
27    /// Builds the [`Module`](crate::module::Module) that owns this file.
28    ///
29    /// The owning module is a child of `consumer` reached through `dep_name`,
30    /// so its transitive imports resolve their own relative paths and
31    /// lockfile entries correctly. Callers consume this instead of
32    /// assembling a module from the file's manifest and root themselves.
33    pub fn child_module(
34        &self,
35        consumer: &crate::module::Module,
36        dep_name: DependencyName,
37    ) -> crate::module::Module {
38        consumer.child(dep_name, self.manifest.clone(), self.module_root.clone())
39    }
40}
41
42/// A fully resolved dependency tree, suitable for `module-lock.json`
43/// generation.
44#[derive(Clone, Debug, Default, PartialEq, Eq)]
45pub struct ResolvedTree {
46    /// The top-level resolved dependencies, keyed by consumer-chosen
47    /// dependency name.
48    pub dependencies: BTreeMap<DependencyName, ResolvedDependency>,
49}
50
51/// One resolved dependency in a [`ResolvedTree`].
52#[derive(Clone, Debug, PartialEq, Eq)]
53pub struct ResolvedDependency {
54    /// The resolved source.
55    pub source: ResolvedSource,
56    /// The version declared in the module's `module.json`.
57    pub version: Version,
58    /// The module's content hash.
59    pub checksum: ContentHash,
60    /// The signer's public key, if the module was signed.
61    pub signer: Option<VerifyingKey>,
62    /// The module's transitive resolved dependencies.
63    pub dependencies: BTreeMap<DependencyName, ResolvedDependency>,
64}
65
66/// One resolved module inside a [`ResolvedDependency`].
67///
68/// This type is produced during resolution before being folded into
69/// [`ResolvedDependency`].
70#[derive(Clone, Debug, PartialEq, Eq)]
71pub struct ResolvedModule {
72    /// The version declared in the module's `module.json`.
73    pub version: Version,
74    /// The module's content hash.
75    pub checksum: ContentHash,
76    /// The signer's public key, if the module was signed.
77    pub signer: Option<VerifyingKey>,
78    /// The module's transitive resolved dependencies.
79    pub dependencies: BTreeMap<DependencyName, ResolvedDependency>,
80}