daml_lf/
package_info.rs

1use crate::element::{DamlArchive, DamlPackage};
2use crate::{DamlLfResult, DarFile, LanguageVersion};
3
4/// Information about a `DamlPackage`.
5#[derive(Debug, Eq, PartialEq, Hash, Clone)]
6pub struct PackageInfo {
7    pub package_id: String,
8    pub package_name: String,
9    pub version: Option<String>,
10    pub language_version: LanguageVersion,
11}
12
13impl PackageInfo {
14    pub fn new(
15        package_id: impl Into<String>,
16        package_name: impl Into<String>,
17        version: impl Into<Option<String>>,
18        language_version: LanguageVersion,
19    ) -> Self {
20        Self {
21            package_id: package_id.into(),
22            package_name: package_name.into(),
23            version: version.into(),
24            language_version,
25        }
26    }
27
28    /// Extract extended information about the packages in a `DarFile`.
29    ///
30    /// This is a relatively expensive operation as it involves creating a full `DamlArchive` representation of the
31    /// given `DarFile`.
32    ///
33    /// This is useful when examining a `DarFile` which has been constructed from a collection of packages (i.e. dalf
34    /// files or packages downloaded from a ledger) which do not have metadata.
35    pub fn extract_from_dar(dar: &DarFile) -> DamlLfResult<Vec<Self>> {
36        dar.apply(Self::extract_from_archive)
37    }
38
39    /// Extract extended information about the packages in a `DamlArchive`.
40    pub fn extract_from_archive(archive: &DamlArchive<'_>) -> Vec<Self> {
41        archive.packages().map(Self::extract_from_package).collect()
42    }
43
44    /// Extract extended information from a `DamlPackage`.
45    pub fn extract_from_package(package: &DamlPackage<'_>) -> Self {
46        Self::new(
47            package.package_id(),
48            package.name(),
49            package.version().map(ToOwned::to_owned),
50            package.language_version(),
51        )
52    }
53
54    /// Extract extended package information about the package which matches the predicate.
55    pub fn find_from_archive<F>(archive: &DamlArchive<'_>, f: F) -> Option<Self>
56    where
57        F: Fn(&DamlPackage<'_>) -> bool,
58    {
59        archive.packages().find_map(|p| f(p).then(|| Self::extract_from_package(p)))
60    }
61}