Skip to main content

runmat_package/identity/
instance.rs

1use super::{CanonicalPackageId, ContentDigest, PackageVersion, SourceId};
2use serde::{Deserialize, Serialize};
3use std::fmt::{Display, Formatter};
4
5#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
6pub struct PackageInstanceId {
7    pub package: CanonicalPackageId,
8    pub source: SourceId,
9    #[serde(skip_serializing_if = "Option::is_none")]
10    pub version: Option<PackageVersion>,
11    pub tree_digest: ContentDigest,
12    pub identity_digest: ContentDigest,
13}
14
15impl PackageInstanceId {
16    pub fn new(
17        package: CanonicalPackageId,
18        source: SourceId,
19        version: Option<PackageVersion>,
20        tree_digest: ContentDigest,
21    ) -> Self {
22        let canonical = format!(
23            "package-instance-v1\npackage={package}\nsource={source}\nversion={}\ntree={tree_digest}\n",
24            version
25                .as_ref()
26                .map(ToString::to_string)
27                .unwrap_or_default()
28        );
29        let identity_digest = ContentDigest::sha256(canonical);
30        Self {
31            package,
32            source,
33            version,
34            tree_digest,
35            identity_digest,
36        }
37    }
38}
39
40impl Display for PackageInstanceId {
41    fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
42        write!(formatter, "{}#{}", self.package, self.identity_digest)
43    }
44}