use pedant_core::resolution::go::{GoProjectResolution, GoResolutionSnapshot, GoUnitBinding};
use pedant_types::{ResolutionReport, ResolutionUnit, SymbolDefinition, SymbolKind};
use crate::error::GraphBuildError;
use crate::id::index_of;
use crate::projection::validation as neutral;
pub(crate) fn check_snapshot_identity(
snapshot: &GoResolutionSnapshot,
resolution: &GoProjectResolution,
) -> Result<(), GraphBuildError> {
neutral::matching_fingerprint(snapshot.fingerprint(), resolution.snapshot_fingerprint())
}
pub(crate) fn stated_binding<'a>(
resolution: &'a GoProjectResolution,
unit: &ResolutionUnit,
) -> Result<&'a GoUnitBinding, GraphBuildError> {
resolution
.unit(unit.id())
.ok_or(GraphBuildError::MissingUnitBinding {
unit: unit.id().index(),
})
}
pub(crate) fn package_declaration(
declared: Option<u32>,
unit: u32,
) -> Result<u32, GraphBuildError> {
declared.ok_or(GraphBuildError::MissingUnitDeclaration { unit })
}
pub(crate) fn distinct_declaration(held: Option<u32>, unit: u32) -> Result<(), GraphBuildError> {
match held {
None => Ok(()),
Some(_) => Err(GraphBuildError::RepeatedUnitDeclaration { unit }),
}
}
pub(crate) fn holder_kind(
report: &ResolutionReport,
holder: u32,
) -> Result<SymbolKind, GraphBuildError> {
report
.definitions()
.get(index_of(holder))
.map(SymbolDefinition::kind)
.ok_or(GraphBuildError::MissingDefinitionNode { definition: holder })
}