11// SPDX-License-Identifier: MPL-2.0
22
33use std:: cell:: RefCell ;
4- use std:: collections:: BTreeMap ;
54use std:: fmt:: { Debug , Display } ;
65use std:: hash:: Hash ;
76
87use pubgrub:: {
98 resolve, Dependencies , DependencyConstraints , DependencyProvider , Map ,
10- OfflineDependencyProvider , PackageArena , PackageId , Ranges ,
9+ OfflineDependencyProvider , PackageArena , PackageId , PackageVersionWrapper , PubGrubError ,
10+ Ranges , SelectedDependencies , VersionIndex , VersionRanges , VersionSet ,
1111} ;
1212
1313type 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+ }
1540
1641// An example implementing caching dependency provider that will
1742// 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 >
1944where
2045 DP :: P : Debug + Display + Clone + Eq + Hash ,
2146{
2247 remote_dependencies : DP ,
23- cached_dependencies : CachedDeps < DP :: V , DP :: VS > ,
48+ cached_dependencies : RefCell < Map < PackageId , Map < VersionIndex , DependencyConstraints > > > ,
2449}
2550
26- impl < DP : DependencyProvider > CachingDependencyProvider < DP >
51+ impl < DP : RemoteProvider < R = R > , R : VersionRanges > CachingDependencyProvider < DP , R >
2752where
2853 DP :: P : Debug + Display + Clone + Eq + Hash ,
2954{
30- pub fn new ( remote_dependencies_provider : DP ) -> Self {
55+ fn new ( remote_dependencies_provider : DP ) -> Self {
3156 CachingDependencyProvider {
3257 remote_dependencies : remote_dependencies_provider,
3358 cached_dependencies : Default :: default ( ) ,
3459 }
3560 }
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+ }
3672}
3773
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 >
3976where
4077 DP :: P : Debug + Display + Clone + Eq + Hash ,
78+ R :: V : Clone ,
4179{
4280 // Cache dependencies if they were already queried
4381 fn get_dependencies (
4482 & mut self ,
4583 package_id : PackageId ,
46- version : & DP :: V ,
84+ version_index : VersionIndex ,
4785 package_store : & mut PackageArena < Self :: P > ,
48- ) -> Result < Dependencies < DP :: VS , DP :: M > , DP :: Err > {
86+ ) -> Result < Dependencies < DP :: M > , DP :: Err > {
4987 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+ {
5192 return Ok ( Dependencies :: Available ( deps. clone ( ) ) ) ;
5293 }
5394
5495 match self
5596 . remote_dependencies
56- . get_dependencies ( package_id, version , package_store)
97+ . get_dependencies ( package_id, version_index , package_store)
5798 {
5899 Ok ( Dependencies :: Available ( deps) ) => {
59100 cache
60101 . entry ( package_id)
61102 . or_default ( )
62- . insert ( version . clone ( ) , deps. clone ( ) ) ;
103+ . insert ( version_index , deps. clone ( ) ) ;
63104 Ok ( Dependencies :: Available ( deps) )
64105 }
65106
@@ -71,31 +112,47 @@ where
71112 fn choose_version (
72113 & mut self ,
73114 package_id : PackageId ,
74- ranges : & DP :: VS ,
115+ set : VersionSet ,
75116 package_store : & PackageArena < Self :: P > ,
76- ) -> Result < Option < DP :: V > , DP :: Err > {
117+ ) -> Result < Option < VersionIndex > , DP :: Err > {
77118 self . remote_dependencies
78- . choose_version ( package_id, ranges , package_store)
119+ . choose_version ( package_id, set , package_store)
79120 }
80121
81122 type Priority = DP :: Priority ;
82123
83124 fn prioritize (
84125 & mut self ,
85126 package_id : PackageId ,
86- ranges : & DP :: VS ,
127+ set : VersionSet ,
87128 package_store : & PackageArena < Self :: P > ,
88129 ) -> Self :: Priority {
89130 self . remote_dependencies
90- . prioritize ( package_id, ranges , package_store)
131+ . prioritize ( package_id, set , package_store)
91132 }
92133
93134 type Err = DP :: Err ;
94135
95136 type P = DP :: P ;
96- type V = DP :: V ;
97- type VS = DP :: VS ;
98137 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+ }
99156}
100157
101158fn main ( ) {
@@ -108,6 +165,6 @@ fn main() {
108165 let mut caching_dependencies_provider =
109166 CachingDependencyProvider :: new ( remote_dependencies_provider) ;
110167
111- let solution = resolve ( & mut caching_dependencies_provider , "root" , 1u32 ) ;
168+ let solution = caching_dependencies_provider . resolve ( "root" , 1u32 ) ;
112169 println ! ( "Solution: {:?}" , solution) ;
113170}
0 commit comments