1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// SPDX-License-Identifier: MPL-2.0

//! Handling pubgrub errors.

use thiserror::Error;

use crate::report::DerivationTree;
use crate::solver::DependencyProvider;

/// Errors that may occur while solving dependencies.
#[derive(Error)]
pub enum PubGrubError<DP>
where
    DP: DependencyProvider,
{
    /// There is no solution for this set of dependencies.
    #[error("No solution")]
    NoSolution(DerivationTree<DP::P, DP::VS>),

    /// Error arising when the implementer of
    /// [DependencyProvider]
    /// returned an error in the method
    /// [get_dependencies](crate::solver::DependencyProvider::get_dependencies).
    #[error("Retrieving dependencies of {package} {version} failed")]
    ErrorRetrievingDependencies {
        /// Package whose dependencies we want.
        package: DP::P,
        /// Version of the package for which we want the dependencies.
        version: DP::V,
        /// Error raised by the implementer of
        /// [DependencyProvider].
        source: DP::Err,
    },

    /// Error arising when the implementer of
    /// [DependencyProvider]
    /// returned a dependency on the requested package.
    /// This technically means that the package directly depends on itself,
    /// and is clearly some kind of mistake.
    #[error("{package} {version} depends on itself")]
    SelfDependency {
        /// Package whose dependencies we want.
        package: DP::P,
        /// Version of the package for which we want the dependencies.
        version: DP::V,
    },

    /// Error arising when the implementer of
    /// [DependencyProvider]
    /// returned an error in the method
    /// [choose_version](crate::solver::DependencyProvider::choose_version).
    #[error("Decision making failed")]
    ErrorChoosingPackageVersion(#[source] DP::Err),

    /// Error arising when the implementer of [DependencyProvider]
    /// returned an error in the method [should_cancel](crate::solver::DependencyProvider::should_cancel).
    #[error("We should cancel")]
    ErrorInShouldCancel(#[source] DP::Err),

    /// Something unexpected happened.
    #[error("{0}")]
    Failure(String),
}

impl<DP> std::fmt::Debug for PubGrubError<DP>
where
    DP: DependencyProvider,
{
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Self::NoSolution(arg0) => f.debug_tuple("NoSolution").field(arg0).finish(),
            Self::ErrorRetrievingDependencies {
                package,
                version,
                source,
            } => f
                .debug_struct("ErrorRetrievingDependencies")
                .field("package", package)
                .field("version", version)
                .field("source", source)
                .finish(),
            Self::SelfDependency { package, version } => f
                .debug_struct("SelfDependency")
                .field("package", package)
                .field("version", version)
                .finish(),
            Self::ErrorChoosingPackageVersion(arg0) => f
                .debug_tuple("ErrorChoosingPackageVersion")
                .field(arg0)
                .finish(),
            Self::ErrorInShouldCancel(arg0) => {
                f.debug_tuple("ErrorInShouldCancel").field(arg0).finish()
            }
            Self::Failure(arg0) => f.debug_tuple("Failure").field(arg0).finish(),
        }
    }
}