runmat_package/resolve/
incompatibility.rs1use crate::{CanonicalPackageId, PackageAlias};
2use semver::VersionReq;
3use serde::{Deserialize, Serialize};
4use std::fmt::{Display, Formatter};
5
6#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
7pub struct RequirementPath {
8 pub root: String,
9 pub aliases: Vec<PackageAlias>,
10}
11
12impl Display for RequirementPath {
13 fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
14 formatter.write_str(&self.root)?;
15 for alias in &self.aliases {
16 write!(formatter, " -> {alias}")?;
17 }
18 Ok(())
19 }
20}
21
22#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
23pub struct Incompatibility {
24 pub package: Box<CanonicalPackageId>,
25 pub requirement: Box<VersionReq>,
26 pub paths: Vec<RequirementPath>,
27 pub reason: String,
28}
29
30impl Display for Incompatibility {
31 fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
32 write!(
33 formatter,
34 "cannot resolve {} {}: {}",
35 self.package, self.requirement, self.reason
36 )?;
37 for path in &self.paths {
38 write!(formatter, "\n required by {path}")?;
39 }
40 Ok(())
41 }
42}