1
1
use crate :: files:: index:: Package as IndexPackage ;
2
+ use crate :: files:: variables:: AppConfig ;
2
3
use crate :: files:: versions:: Package as VersionsPackage ;
3
- use log:: info;
4
+ use log:: { debug , info} ;
4
5
use std:: error:: Error ;
6
+ use std:: fs;
5
7
6
8
#[ derive( Debug , Clone ) ]
7
9
pub struct Package {
@@ -13,12 +15,7 @@ pub struct Package {
13
15
// Public API
14
16
impl Package {
15
17
pub fn new ( name : & str , versions_package : VersionsPackage ) -> Result < Self , Box < dyn Error > > {
16
- let index_packages = crate :: files:: index:: parse ( name. to_owned ( ) ) ?;
17
- let index_package = index_packages
18
- . packages
19
- . get ( name)
20
- . map ( |pkg| pkg. to_owned ( ) )
21
- . unwrap_or_else ( || IndexPackage :: new ( name) ) ;
18
+ let index_package = crate :: files:: index:: parse ( name. to_owned ( ) ) ?;
22
19
Ok ( Self {
23
20
name : String :: from ( name) ,
24
21
index : index_package,
@@ -27,23 +24,34 @@ impl Package {
27
24
}
28
25
29
26
pub fn load ( name : & str ) -> Result < Option < Self > , Box < dyn Error > > {
30
- let index_package = crate :: files:: index:: parse ( name. to_owned ( ) ) ?
31
- . packages
32
- . remove ( name) ;
33
- let versions_package = crate :: files:: versions:: parse ( ) ?. packages . remove ( name) ;
34
- Self :: make_from ( name, index_package, versions_package)
27
+ if let Some ( versions_package) = crate :: files:: versions:: parse ( name. to_owned ( ) ) ? {
28
+ let index_package = crate :: files:: index:: parse ( name. to_owned ( ) ) ?;
29
+ let package = Self :: make_from ( name, index_package, versions_package) ?;
30
+ Ok ( Some ( package) )
31
+ } else {
32
+ Ok ( None )
33
+ }
35
34
}
36
35
37
36
pub fn load_all ( ) -> Result < Vec < Self > , Box < dyn Error > > {
38
- let versions_config = crate :: files:: versions:: parse ( ) ?;
39
37
let mut packages: Vec < Self > = Vec :: new ( ) ;
38
+ let config = AppConfig :: new ( ) ;
39
+ for entry in fs:: read_dir ( config. versions_path ( ) ) ? {
40
+ let entry = entry?;
41
+ let path = entry. path ( ) ;
42
+ if path. is_file ( ) && path. extension ( ) . and_then ( |s| s. to_str ( ) ) == Some ( "json" ) {
43
+ let name = path
44
+ . file_stem ( )
45
+ . and_then ( |s| s. to_str ( ) )
46
+ . ok_or ( "Invalid package name" ) ?
47
+ . to_string ( ) ;
40
48
41
- for name in versions_config. packages . keys ( ) {
42
- if let Some ( package) = Self :: load ( name) ? {
43
- packages. push ( package) ;
49
+ if let Some ( package) = Self :: load ( & name) ? {
50
+ debug ! ( "Loading package {}" , name) ;
51
+ packages. push ( package) ;
52
+ }
44
53
}
45
54
}
46
-
47
55
Ok ( packages)
48
56
}
49
57
@@ -93,21 +101,13 @@ impl Package {
93
101
impl Package {
94
102
fn make_from (
95
103
name : & str ,
96
- index_package : Option < IndexPackage > ,
97
- versions_package : Option < VersionsPackage > ,
98
- ) -> Result < Option < Self > , Box < dyn Error > > {
99
- match ( index_package, versions_package) {
100
- ( Some ( index_package) , Some ( versions_package) ) => Ok ( Some ( Self {
101
- name : String :: from ( name) ,
102
- index : index_package,
103
- versions : versions_package,
104
- } ) ) ,
105
- ( None , Some ( versions_package) ) => Ok ( Some ( Self {
106
- name : String :: from ( name) ,
107
- index : IndexPackage :: new ( name) ,
108
- versions : versions_package,
109
- } ) ) ,
110
- ( _, None ) => Ok ( None ) ,
111
- }
104
+ index_package : IndexPackage ,
105
+ versions_package : VersionsPackage ,
106
+ ) -> Result < Self , Box < dyn Error > > {
107
+ Ok ( Self {
108
+ name : String :: from ( name) ,
109
+ index : index_package,
110
+ versions : versions_package,
111
+ } )
112
112
}
113
113
}
0 commit comments