1use crate::element::{DamlArchive, DamlPackage};
2use crate::{DamlLfResult, DarFile, LanguageVersion};
3
4#[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 pub fn extract_from_dar(dar: &DarFile) -> DamlLfResult<Vec<Self>> {
36 dar.apply(Self::extract_from_archive)
37 }
38
39 pub fn extract_from_archive(archive: &DamlArchive<'_>) -> Vec<Self> {
41 archive.packages().map(Self::extract_from_package).collect()
42 }
43
44 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 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}