use std::sync::Arc;
use crate::ir::semantic::{
SemanticEdgeClaim, SemanticSnapshotClaim, SemanticSourceClaim, SemanticUnitClaim,
};
use crate::resolution::rust::dependency::DependencyActivation;
use crate::resolution::rust::identity::index_of;
use crate::resolution::rust::snapshot::{RustResolutionSnapshot, RustSource};
use super::target::crate_name;
pub(super) fn state(snapshot: &RustResolutionSnapshot) -> SemanticSnapshotClaim {
let units: Box<[SemanticUnitClaim]> = snapshot
.units()
.iter()
.map(|unit| SemanticUnitClaim {
name: crate_name(unit),
crate_root: Arc::from(unit.crate_root()),
sources: unit.sources().iter().map(Arc::clone).collect(),
conditional: is_conditional(unit.activation()),
})
.collect();
let edges: Box<[SemanticEdgeClaim]> = snapshot
.edges()
.iter()
.map(|edge| SemanticEdgeClaim {
source: index_of(edge.source().index()),
target: index_of(edge.target().index()),
alias: Arc::from(edge.name()),
conditional: is_conditional(edge.activation()),
})
.collect();
let sources: Box<[SemanticSourceClaim]> = snapshot.sources().iter().map(source).collect();
SemanticSnapshotClaim {
fingerprint: *snapshot.fingerprint().bytes(),
root: Box::from(snapshot.root()),
requested: index_of(snapshot.root_unit().index()),
units,
edges,
sources,
}
}
fn source(source: &RustSource) -> SemanticSourceClaim {
SemanticSourceClaim {
path: Arc::from(source.path()),
digest: *source.digest(),
}
}
fn is_conditional(activation: &DependencyActivation) -> bool {
matches!(activation, DependencyActivation::Conditional(_))
}