Skip to content

Commit d196583

Browse files
committed
..
1 parent da1d481 commit d196583

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

crates/uv-pypi-types/src/conflicts.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ impl Conflicts {
188188
.filter(|set| set.contains_item(&canonical_item))
189189
{
190190
for sub in &subs {
191-
let mut new_set = conflict_set.replaced_item(&canonical_item, (**sub).clone());
191+
let mut new_set = conflict_set.replaced_item(&canonical_item, (**sub).clone()).expect("`ConflictItem` should be in `ConflictSet`");
192192
if !direct_conflict_sets.contains(&new_set) {
193193
new_set.set_as_inferred_conflict();
194194
if !transitive_conflict_sets.contains(&new_set) {
@@ -259,14 +259,17 @@ impl ConflictSet {
259259
// FIXME: Error if old is not present
260260
/// Replace an old [`ConflictItem`] with a new one.
261261
#[must_use]
262-
pub fn replaced_item(&self, old: &ConflictItem, new: ConflictItem) -> Self {
262+
pub fn replaced_item(&self, old: &ConflictItem, new: ConflictItem) -> Result<Self, ConflictError> {
263263
let mut new_set = self.set.clone();
264+
if !new_set.contains(old) {
265+
return Err(ConflictError::ReplaceMissingConflictItem);
266+
}
264267
new_set.remove(old);
265268
new_set.insert(new);
266-
Self {
269+
Ok(Self {
267270
set: new_set,
268271
is_inferred_conflict: false,
269-
}
272+
})
270273
}
271274

272275
/// Mark this [`ConflictSet`] as being inferred from directly
@@ -555,6 +558,8 @@ pub enum ConflictError {
555558
FoundExtraAndGroup,
556559
#[error("Cycle detected in transitive conflict inclusion")]
557560
ConflictInclusionCycle,
561+
#[error("Expected `ConflictSet` to contain `ConflictItem` to replace")]
562+
ReplaceMissingConflictItem
558563
}
559564

560565
/// Like [`Conflicts`], but for deserialization in `pyproject.toml`.

0 commit comments

Comments
 (0)