1
1
// SPDX-License-Identifier: MPL-2.0
2
2
3
3
use std:: cell:: RefCell ;
4
- use std:: collections:: BTreeMap ;
5
4
use std:: fmt:: { Debug , Display } ;
6
5
use std:: hash:: Hash ;
7
6
8
7
use pubgrub:: {
9
8
resolve, Dependencies , DependencyConstraints , DependencyProvider , Map ,
10
- OfflineDependencyProvider , PackageArena , PackageId , Ranges ,
9
+ OfflineDependencyProvider , PackageArena , PackageId , PackageVersionWrapper , PubGrubError ,
10
+ Ranges , SelectedDependencies , VersionIndex , VersionRanges , VersionSet ,
11
11
} ;
12
12
13
13
type NumVS = Ranges < u32 > ;
14
- type CachedDeps < V , VS > = RefCell < Map < PackageId , BTreeMap < V , DependencyConstraints < VS > > > > ;
14
+
15
+ trait RemoteProvider : DependencyProvider < P = PackageVersionWrapper < Self :: Pkg > > {
16
+ type Pkg : Debug + Display + Clone + Eq + Hash ;
17
+ type R : VersionRanges ;
18
+
19
+ fn resolve_parameters (
20
+ & self ,
21
+ p : Self :: Pkg ,
22
+ v : impl Into < <Self :: R as VersionRanges >:: V > ,
23
+ ) -> Option < ( PackageVersionWrapper < Self :: Pkg > , VersionIndex ) > ;
24
+ }
25
+
26
+ impl < P : Debug + Display + Clone + Eq + Hash , R : VersionRanges > RemoteProvider
27
+ for OfflineDependencyProvider < P , R >
28
+ {
29
+ type Pkg = P ;
30
+ type R = R ;
31
+
32
+ fn resolve_parameters (
33
+ & self ,
34
+ p : P ,
35
+ v : impl Into < <Self :: R as VersionRanges >:: V > ,
36
+ ) -> Option < ( PackageVersionWrapper < P > , VersionIndex ) > {
37
+ self . resolve_parameters ( p, v)
38
+ }
39
+ }
15
40
16
41
// An example implementing caching dependency provider that will
17
42
// store queried dependencies in memory and check them before querying more from remote.
18
- struct CachingDependencyProvider < DP : DependencyProvider >
43
+ struct CachingDependencyProvider < DP : RemoteProvider < R = R > , R : VersionRanges >
19
44
where
20
45
DP :: P : Debug + Display + Clone + Eq + Hash ,
21
46
{
22
47
remote_dependencies : DP ,
23
- cached_dependencies : CachedDeps < DP :: V , DP :: VS > ,
48
+ cached_dependencies : RefCell < Map < PackageId , Map < VersionIndex , DependencyConstraints > > > ,
24
49
}
25
50
26
- impl < DP : DependencyProvider > CachingDependencyProvider < DP >
51
+ impl < DP : RemoteProvider < R = R > , R : VersionRanges > CachingDependencyProvider < DP , R >
27
52
where
28
53
DP :: P : Debug + Display + Clone + Eq + Hash ,
29
54
{
30
- pub fn new ( remote_dependencies_provider : DP ) -> Self {
55
+ fn new ( remote_dependencies_provider : DP ) -> Self {
31
56
CachingDependencyProvider {
32
57
remote_dependencies : remote_dependencies_provider,
33
58
cached_dependencies : Default :: default ( ) ,
34
59
}
35
60
}
61
+
62
+ fn resolve (
63
+ & mut self ,
64
+ p : <DP as RemoteProvider >:: Pkg ,
65
+ v : impl Into < R :: V > ,
66
+ ) -> Result < SelectedDependencies < Self > , PubGrubError < Self > > {
67
+ let Some ( ( p, v) ) = self . remote_dependencies . resolve_parameters ( p, v) else {
68
+ return Err ( PubGrubError :: NoRoot ) ;
69
+ } ;
70
+ resolve ( self , p, v)
71
+ }
36
72
}
37
73
38
- impl < DP : DependencyProvider < M = & ' static str > > DependencyProvider for CachingDependencyProvider < DP >
74
+ impl < DP : RemoteProvider < R = R > , R : VersionRanges > DependencyProvider
75
+ for CachingDependencyProvider < DP , R >
39
76
where
40
77
DP :: P : Debug + Display + Clone + Eq + Hash ,
78
+ R :: V : Clone ,
41
79
{
42
80
// Cache dependencies if they were already queried
43
81
fn get_dependencies (
44
82
& mut self ,
45
83
package_id : PackageId ,
46
- version : & DP :: V ,
84
+ version_index : VersionIndex ,
47
85
package_store : & mut PackageArena < Self :: P > ,
48
- ) -> Result < Dependencies < DP :: VS , DP :: M > , DP :: Err > {
86
+ ) -> Result < Dependencies < DP :: M > , DP :: Err > {
49
87
let mut cache = self . cached_dependencies . borrow_mut ( ) ;
50
- if let Some ( deps) = cache. get ( & package_id) . and_then ( |vmap| vmap. get ( version) ) {
88
+ if let Some ( deps) = cache
89
+ . get ( & package_id)
90
+ . and_then ( |vmap| vmap. get ( & version_index) )
91
+ {
51
92
return Ok ( Dependencies :: Available ( deps. clone ( ) ) ) ;
52
93
}
53
94
54
95
match self
55
96
. remote_dependencies
56
- . get_dependencies ( package_id, version , package_store)
97
+ . get_dependencies ( package_id, version_index , package_store)
57
98
{
58
99
Ok ( Dependencies :: Available ( deps) ) => {
59
100
cache
60
101
. entry ( package_id)
61
102
. or_default ( )
62
- . insert ( version . clone ( ) , deps. clone ( ) ) ;
103
+ . insert ( version_index , deps. clone ( ) ) ;
63
104
Ok ( Dependencies :: Available ( deps) )
64
105
}
65
106
@@ -71,31 +112,47 @@ where
71
112
fn choose_version (
72
113
& mut self ,
73
114
package_id : PackageId ,
74
- ranges : & DP :: VS ,
115
+ set : VersionSet ,
75
116
package_store : & PackageArena < Self :: P > ,
76
- ) -> Result < Option < DP :: V > , DP :: Err > {
117
+ ) -> Result < Option < VersionIndex > , DP :: Err > {
77
118
self . remote_dependencies
78
- . choose_version ( package_id, ranges , package_store)
119
+ . choose_version ( package_id, set , package_store)
79
120
}
80
121
81
122
type Priority = DP :: Priority ;
82
123
83
124
fn prioritize (
84
125
& mut self ,
85
126
package_id : PackageId ,
86
- ranges : & DP :: VS ,
127
+ set : VersionSet ,
87
128
package_store : & PackageArena < Self :: P > ,
88
129
) -> Self :: Priority {
89
130
self . remote_dependencies
90
- . prioritize ( package_id, ranges , package_store)
131
+ . prioritize ( package_id, set , package_store)
91
132
}
92
133
93
134
type Err = DP :: Err ;
94
135
95
136
type P = DP :: P ;
96
- type V = DP :: V ;
97
- type VS = DP :: VS ;
98
137
type M = DP :: M ;
138
+
139
+ fn package_version_display < ' a > (
140
+ & ' a self ,
141
+ package : & ' a Self :: P ,
142
+ version_index : VersionIndex ,
143
+ ) -> impl Display + ' a {
144
+ self . remote_dependencies
145
+ . package_version_display ( package, version_index)
146
+ }
147
+
148
+ fn package_version_set_display < ' a > (
149
+ & ' a self ,
150
+ package : & ' a Self :: P ,
151
+ version_set : VersionSet ,
152
+ ) -> impl Display + ' a {
153
+ self . remote_dependencies
154
+ . package_version_set_display ( package, version_set)
155
+ }
99
156
}
100
157
101
158
fn main ( ) {
@@ -108,6 +165,6 @@ fn main() {
108
165
let mut caching_dependencies_provider =
109
166
CachingDependencyProvider :: new ( remote_dependencies_provider) ;
110
167
111
- let solution = resolve ( & mut caching_dependencies_provider , "root" , 1u32 ) ;
168
+ let solution = caching_dependencies_provider . resolve ( "root" , 1u32 ) ;
112
169
println ! ( "Solution: {:?}" , solution) ;
113
170
}
0 commit comments