File: branching_error_reporting.rs

package info (click to toggle)
rust-astral-pubgrub 0.3.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 532 kB
  • sloc: makefile: 2
file content (66 lines) | stat: -rw-r--r-- 2,373 bytes parent folder | download
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
// SPDX-License-Identifier: MPL-2.0

use pubgrub::{
    DefaultStringReporter, OfflineDependencyProvider, PubGrubError, Ranges, Reporter,
    SemanticVersion, resolve,
};

type SemVS = Ranges<SemanticVersion>;

// https://github.com/dart-lang/pub/blob/master/doc/solver.md#branching-error-reporting
fn main() {
    let mut dependency_provider = OfflineDependencyProvider::<&str, SemVS>::new();
    #[rustfmt::skip]
    // root 1.0.0 depends on foo ^1.0.0
        dependency_provider.add_dependencies(
        "root", (1, 0, 0),
        [("foo", Ranges::from_range_bounds((1, 0, 0)..(2, 0, 0)))],
    );
    #[rustfmt::skip]
    // foo 1.0.0 depends on a ^1.0.0 and b ^1.0.0
        dependency_provider.add_dependencies(
        "foo", (1, 0, 0),
        [
            ("a", Ranges::from_range_bounds((1, 0, 0)..(2, 0, 0))),
            ("b", Ranges::from_range_bounds((1, 0, 0)..(2, 0, 0))),
        ],
    );
    #[rustfmt::skip]
    // foo 1.1.0 depends on x ^1.0.0 and y ^1.0.0
        dependency_provider.add_dependencies(
        "foo", (1, 1, 0),
        [
            ("x", Ranges::from_range_bounds((1, 0, 0)..(2, 0, 0))),
            ("y", Ranges::from_range_bounds((1, 0, 0)..(2, 0, 0))),
        ],
    );
    #[rustfmt::skip]
    // a 1.0.0 depends on b ^2.0.0
        dependency_provider.add_dependencies(
        "a", (1, 0, 0),
        [("b", Ranges::from_range_bounds((2, 0, 0)..(3, 0, 0)))],
    );
    // b 1.0.0 and 2.0.0 have no dependencies.
    dependency_provider.add_dependencies("b", (1, 0, 0), []);
    dependency_provider.add_dependencies("b", (2, 0, 0), []);
    #[rustfmt::skip]
    // x 1.0.0 depends on y ^2.0.0.
        dependency_provider.add_dependencies(
        "x", (1, 0, 0),
        [("y", Ranges::from_range_bounds((2, 0, 0)..(3, 0, 0)))],
    );
    // y 1.0.0 and 2.0.0 have no dependencies.
    dependency_provider.add_dependencies("y", (1, 0, 0), []);
    dependency_provider.add_dependencies("y", (2, 0, 0), []);

    // Run the algorithm.
    match resolve(&dependency_provider, "root", (1, 0, 0)) {
        Ok(sol) => println!("{sol:?}"),
        Err(PubGrubError::NoSolution(mut derivation_tree)) => {
            derivation_tree.collapse_no_versions();
            eprintln!("{}", DefaultStringReporter::report(&derivation_tree));
            std::process::exit(1);
        }
        Err(err) => panic!("{err:?}"),
    };
}