Skip to main content

runmat_package/resolve/
incompatibility.rs

1use 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}