@@ -8,8 +8,19 @@ use tokio::fs;
88pub async fn ls ( project : & str , config : & Config ) -> Result < Vec < Installation > , Box < dyn Error > > {
99 let d = config. pkgx_dir . join ( project) ;
1010
11- if !fs:: metadata ( & d) . await ?. is_dir ( ) {
12- return Ok ( vec ! [ ] ) ;
11+ match fs:: metadata ( & d) . await {
12+ Ok ( metadata) => {
13+ if !metadata. is_dir ( ) {
14+ return Err ( format ! ( "err: expected directory: {:?}" , d) . into ( ) ) ;
15+ }
16+ }
17+ Err ( e) => {
18+ if e. kind ( ) == std:: io:: ErrorKind :: NotFound {
19+ return Ok ( vec ! [ ] ) ;
20+ } else {
21+ return Err ( e. into ( ) ) ;
22+ }
23+ }
1324 }
1425
1526 let mut rv = vec ! [ ] ;
@@ -39,23 +50,16 @@ pub async fn ls(project: &str, config: &Config) -> Result<Vec<Installation>, Box
3950 Ok ( rv)
4051}
4152
42- pub async fn resolve ( pkgreq : & PackageReq , config : & Config ) -> Result < Installation , Box < dyn Error > > {
43- let installations = ls ( & pkgreq. project , config) . await ?;
44-
45- if let Some ( i) = installations
53+ pub async fn resolve (
54+ pkgreq : & PackageReq ,
55+ config : & Config ,
56+ ) -> Result < Option < Installation > , Box < dyn Error > > {
57+ Ok ( ls ( & pkgreq. project , config)
58+ . await ?
4659 . iter ( )
4760 . filter ( |i| pkgreq. constraint . satisfies ( & i. pkg . version ) )
4861 . max_by_key ( |i| i. pkg . version . clone ( ) )
49- {
50- Ok ( i. clone ( ) )
51- } else {
52- // If no matching version is found, return an error
53- Err ( format ! ( "couldn’t resolve {:?}" , pkgreq) . into ( ) )
54- }
55- }
56-
57- pub async fn has ( pkg : & PackageReq , config : & Config ) -> Option < Installation > {
58- resolve ( pkg, config) . await . ok ( )
62+ . cloned ( ) )
5963}
6064
6165pub fn dst ( pkg : & Package , config : & Config ) -> PathBuf {
0 commit comments