runmat_package/identity/
instance.rs1use 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}