use std::collections::{BTreeMap, BTreeSet};
use uv_fs::Simplified;
use uv_normalize::PackageName;
use uv_pep508::RequirementOrigin;
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum SourceAnnotation {
Constraint(RequirementOrigin),
Override(RequirementOrigin),
Requirement(RequirementOrigin),
}
impl std::fmt::Display for SourceAnnotation {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Requirement(origin) => match origin {
RequirementOrigin::File(path) => {
write!(f, "-r {}", path.portable_display())
}
RequirementOrigin::Project(path, project_name) => {
write!(f, "{project_name} ({})", path.portable_display())
}
RequirementOrigin::Group(path, project_name, group) => {
if let Some(project_name) = project_name {
write!(f, "{project_name} ({}:{group})", path.portable_display())
} else {
write!(f, "({}:{group})", path.portable_display())
}
}
RequirementOrigin::Workspace => {
write!(f, "(workspace)")
}
},
Self::Constraint(origin) => {
write!(f, "-c {}", origin.path().portable_display())
}
Self::Override(origin) => match origin {
RequirementOrigin::File(path) => {
write!(f, "--override {}", path.portable_display())
}
RequirementOrigin::Project(path, project_name) => {
write!(f, "--override {project_name} ({})", path.portable_display())
}
RequirementOrigin::Group(path, project_name, group) => {
if let Some(project_name) = project_name {
write!(
f,
"--override {project_name} ({}:{group})",
path.portable_display()
)
} else {
write!(f, "--override ({}:{group})", path.portable_display())
}
}
RequirementOrigin::Workspace => {
write!(f, "--override (workspace)")
}
},
}
}
}
#[derive(Default, Debug, Clone)]
pub struct SourceAnnotations(BTreeMap<PackageName, BTreeSet<SourceAnnotation>>);
impl SourceAnnotations {
pub fn add(&mut self, package: &PackageName, annotation: SourceAnnotation) {
self.0
.entry(package.clone())
.or_default()
.insert(annotation);
}
pub fn get(&self, package: &PackageName) -> Option<&BTreeSet<SourceAnnotation>> {
self.0.get(package)
}
}