use std::fmt::Display;
use uv_distribution::Metadata;
use uv_distribution_types::{
BuiltDist, Dist, DistributionMetadata, IndexUrl, Name, ResolvedDist, SourceDist,
VersionOrUrlRef,
};
use uv_normalize::{ExtraName, GroupName, PackageName};
use uv_pep440::Version;
use uv_pypi_types::HashDigests;
pub use crate::resolution::display::{AnnotationStyle, DisplayResolutionGraph};
pub(crate) use crate::resolution::output::ResolutionGraphNode;
pub use crate::resolution::output::{ConflictingDistributionError, ResolverOutput};
pub(crate) use crate::resolution::requirements_txt::RequirementsTxtDist;
use crate::universal_marker::UniversalMarker;
mod display;
mod output;
mod requirements_txt;
#[derive(Debug, Clone)]
pub(crate) struct AnnotatedDist {
pub(crate) dist: ResolvedDist,
pub(crate) name: PackageName,
pub(crate) version: Version,
pub(crate) extra: Option<ExtraName>,
pub(crate) group: Option<GroupName>,
pub(crate) hashes: HashDigests,
pub(crate) metadata: Option<Metadata>,
pub(crate) marker: UniversalMarker,
}
impl AnnotatedDist {
pub(crate) fn is_base(&self) -> bool {
self.extra.is_none() && self.group.is_none()
}
pub(crate) fn index(&self) -> Option<&IndexUrl> {
match &self.dist {
ResolvedDist::Installed { .. } => None,
ResolvedDist::Installable { dist, .. } => match dist.as_ref() {
Dist::Built(dist) => match dist {
BuiltDist::Registry(dist) => Some(&dist.best_wheel().index),
BuiltDist::DirectUrl(_) => None,
BuiltDist::Path(_) => None,
},
Dist::Source(dist) => match dist {
SourceDist::Registry(dist) => Some(&dist.index),
SourceDist::DirectUrl(_) => None,
SourceDist::Git(_) => None,
SourceDist::Path(_) => None,
SourceDist::Directory(_) => None,
},
},
}
}
}
impl Name for AnnotatedDist {
fn name(&self) -> &PackageName {
self.dist.name()
}
}
impl DistributionMetadata for AnnotatedDist {
fn version_or_url(&self) -> VersionOrUrlRef<'_> {
self.dist.version_or_url()
}
}
impl Display for AnnotatedDist {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
Display::fmt(&self.dist, f)
}
}