use std::path::PathBuf;
use crate::resolution::rust::dependency::CargoDependencyKind;
use crate::resolution::rust::fingerprint::{
EdgeClaim, RustSnapshotFingerprint, SnapshotClaims, SourceClaim, UnitClaim,
};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct UnitFingerprintClaim {
pub name: String,
pub manifest: String,
pub kind: String,
pub crate_root: String,
pub predicate: Option<String>,
pub sources: Vec<String>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct EdgeFingerprintClaim {
pub source: u32,
pub target: u32,
pub alias: String,
pub kind: CargoDependencyKind,
pub predicate: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct SourceFingerprintClaim {
pub path: String,
pub digest: [u8; 32],
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct SnapshotFingerprintClaim {
pub root: PathBuf,
pub requested: u32,
pub units: Vec<UnitFingerprintClaim>,
pub edges: Vec<EdgeFingerprintClaim>,
pub sources: Vec<SourceFingerprintClaim>,
}
impl SnapshotFingerprintClaim {
pub fn fingerprint(&self) -> RustSnapshotFingerprint {
let memberships: Box<[Box<[&str]>]> = self
.units
.iter()
.map(|unit| unit.sources.iter().map(String::as_str).collect())
.collect();
let units: Box<[UnitClaim<'_>]> = self
.units
.iter()
.zip(&memberships)
.map(|(unit, sources)| stated_unit(unit, sources))
.collect();
let edges: Box<[EdgeClaim<'_>]> = self.edges.iter().map(stated_edge).collect();
let sources: Box<[SourceClaim<'_>]> = self.sources.iter().map(stated_source).collect();
RustSnapshotFingerprint::from_claims(&SnapshotClaims {
root: &self.root,
requested: self.requested,
units: &units,
edges: &edges,
sources: &sources,
})
}
}
fn stated_unit<'a>(unit: &'a UnitFingerprintClaim, sources: &'a [&'a str]) -> UnitClaim<'a> {
UnitClaim {
name: &unit.name,
manifest: &unit.manifest,
kind: &unit.kind,
crate_root: &unit.crate_root,
predicate: unit.predicate.as_deref(),
sources,
}
}
fn stated_edge(edge: &EdgeFingerprintClaim) -> EdgeClaim<'_> {
EdgeClaim {
source: edge.source,
target: edge.target,
alias: &edge.alias,
kind: edge.kind,
predicate: edge.predicate.as_deref(),
}
}
fn stated_source(source: &SourceFingerprintClaim) -> SourceClaim<'_> {
SourceClaim {
path: &source.path,
digest: &source.digest,
}
}