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 , Package , PackageArena , Ranges ,
9+ OfflineDependencyProvider , Package , PackageArena , PubGrubError , Ranges , SelectedDependencies ,
10+ VersionIndex , VersionRanges , VersionSet ,
1111} ;
1212
1313type NumVS = Ranges < u32 > ;
14- type CachedDeps < V , VS > = RefCell < Map < Package , BTreeMap < V , DependencyConstraints < VS > > > > ;
14+
15+ trait RemoteProvider : DependencyProvider {
16+ type R : VersionRanges ;
17+
18+ fn package_version_index (
19+ & self ,
20+ p : & Self :: P ,
21+ v : & <Self :: R as VersionRanges >:: V ,
22+ ) -> Option < VersionIndex > ;
23+ }
24+
25+ impl < P : Debug + Display + Clone + Eq + Hash , R : VersionRanges > RemoteProvider
26+ for OfflineDependencyProvider < P , R >
27+ {
28+ type R = R ;
29+
30+ fn package_version_index (
31+ & self ,
32+ p : & Self :: P ,
33+ v : & <Self :: R as VersionRanges >:: V ,
34+ ) -> Option < VersionIndex > {
35+ self . package_version_index ( p, v)
36+ }
37+ }
1538
1639// An example implementing caching dependency provider that will
1740// store queried dependencies in memory and check them before querying more from remote.
18- struct CachingDependencyProvider < DP : DependencyProvider >
41+ struct CachingDependencyProvider < DP : RemoteProvider < R = R > , R : VersionRanges >
1942where
2043 DP :: P : Debug + Display + Clone + Eq + Hash ,
2144{
2245 remote_dependencies : DP ,
23- cached_dependencies : CachedDeps < DP :: V , DP :: VS > ,
46+ cached_dependencies : RefCell < Map < Package , Map < VersionIndex , DependencyConstraints > > > ,
2447}
2548
26- impl < DP : DependencyProvider > CachingDependencyProvider < DP >
49+ impl < DP : RemoteProvider < R = R > , R : VersionRanges > CachingDependencyProvider < DP , R >
2750where
2851 DP :: P : Debug + Display + Clone + Eq + Hash ,
2952{
30- pub fn new ( remote_dependencies_provider : DP ) -> Self {
53+ fn new ( remote_dependencies_provider : DP ) -> Self {
3154 CachingDependencyProvider {
3255 remote_dependencies : remote_dependencies_provider,
3356 cached_dependencies : Default :: default ( ) ,
3457 }
3558 }
59+
60+ fn resolve (
61+ & mut self ,
62+ p : <Self as DependencyProvider >:: P ,
63+ v : impl Into < R :: V > ,
64+ ) -> Result < SelectedDependencies < Self > , PubGrubError < Self > > {
65+ let Some ( version_index) = self
66+ . remote_dependencies
67+ . package_version_index ( & p, & v. into ( ) )
68+ else {
69+ return Err ( PubGrubError :: NoRoot ) ;
70+ } ;
71+ resolve ( self , p, version_index)
72+ }
3673}
3774
38- impl < DP : DependencyProvider < M = & ' static str > > DependencyProvider for CachingDependencyProvider < DP >
75+ impl < DP : RemoteProvider < R = R > , R : VersionRanges > DependencyProvider
76+ for CachingDependencyProvider < DP , R >
3977where
4078 DP :: P : Debug + Display + Clone + Eq + Hash ,
79+ R :: V : Clone ,
4180{
4281 // Cache dependencies if they were already queried
4382 fn get_dependencies (
4483 & mut self ,
4584 package : Package ,
46- version : & DP :: V ,
85+ version_index : VersionIndex ,
4786 package_store : & mut PackageArena < Self :: P > ,
48- ) -> Result < Dependencies < DP :: VS , DP :: M > , DP :: Err > {
87+ ) -> Result < Dependencies < DP :: M > , DP :: Err > {
4988 let mut cache = self . cached_dependencies . borrow_mut ( ) ;
50- if let Some ( deps) = cache. get ( & package) . and_then ( |vmap| vmap. get ( version) ) {
89+ if let Some ( deps) = cache
90+ . get ( & package)
91+ . and_then ( |vmap| vmap. get ( & version_index) )
92+ {
5193 return Ok ( Dependencies :: Available ( deps. clone ( ) ) ) ;
5294 }
5395
5496 match self
5597 . remote_dependencies
56- . get_dependencies ( package, version , package_store)
98+ . get_dependencies ( package, version_index , package_store)
5799 {
58100 Ok ( Dependencies :: Available ( deps) ) => {
59101 cache
60102 . entry ( package)
61103 . or_default ( )
62- . insert ( version . clone ( ) , deps. clone ( ) ) ;
104+ . insert ( version_index , deps. clone ( ) ) ;
63105 Ok ( Dependencies :: Available ( deps) )
64106 }
65107
@@ -71,31 +113,47 @@ where
71113 fn choose_version (
72114 & mut self ,
73115 package : Package ,
74- ranges : & DP :: VS ,
116+ set : VersionSet ,
75117 package_store : & PackageArena < Self :: P > ,
76- ) -> Result < Option < DP :: V > , DP :: Err > {
118+ ) -> Result < Option < VersionIndex > , DP :: Err > {
77119 self . remote_dependencies
78- . choose_version ( package, ranges , package_store)
120+ . choose_version ( package, set , package_store)
79121 }
80122
81123 type Priority = DP :: Priority ;
82124
83125 fn prioritize (
84126 & mut self ,
85127 package : Package ,
86- ranges : & DP :: VS ,
128+ set : VersionSet ,
87129 package_store : & PackageArena < Self :: P > ,
88130 ) -> Self :: Priority {
89131 self . remote_dependencies
90- . prioritize ( package, ranges , package_store)
132+ . prioritize ( package, set , package_store)
91133 }
92134
93135 type Err = DP :: Err ;
94136
95137 type P = DP :: P ;
96- type V = DP :: V ;
97- type VS = DP :: VS ;
98138 type M = DP :: M ;
139+
140+ fn package_version_repr < ' a > (
141+ & ' a self ,
142+ pkg : & ' a Self :: P ,
143+ version_index : VersionIndex ,
144+ ) -> impl Display + ' a {
145+ self . remote_dependencies
146+ . package_version_repr ( pkg, version_index)
147+ }
148+
149+ fn package_version_set_repr < ' a > (
150+ & ' a self ,
151+ pkg : & ' a Self :: P ,
152+ version_set : VersionSet ,
153+ ) -> impl Display + ' a {
154+ self . remote_dependencies
155+ . package_version_set_repr ( pkg, version_set)
156+ }
99157}
100158
101159fn main ( ) {
@@ -108,6 +166,6 @@ fn main() {
108166 let mut caching_dependencies_provider =
109167 CachingDependencyProvider :: new ( remote_dependencies_provider) ;
110168
111- let solution = resolve ( & mut caching_dependencies_provider , "root" , 1u32 ) ;
169+ let solution = caching_dependencies_provider . resolve ( "root" , 1u32 ) ;
112170 println ! ( "Solution: {:?}" , solution) ;
113171}
0 commit comments