@@ -5,41 +5,29 @@ use nom::{
5
5
} ;
6
6
7
7
#[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
8
- pub ( crate ) struct DbPaths < ' a > {
9
- pub ( crate ) base_path : & ' a str ,
10
- pub ( crate ) path : & ' a str ,
8
+ pub ( crate ) struct DbPaths {
9
+ pub ( crate ) base_path : String ,
10
+ pub ( crate ) path : String ,
11
11
}
12
12
13
- pub ( crate ) fn parse_butler_db < ' a > ( content : & ' a [ u8 ] ) -> nom:: IResult < & [ u8 ] , Vec < DbPaths < ' a > > > {
13
+ pub ( crate ) fn parse_butler_db < ' a > ( content : & ' a [ u8 ] ) -> nom:: IResult < & [ u8 ] , Vec < DbPaths > > {
14
14
many0 ( parse_path) ( content)
15
15
}
16
16
17
- fn parse_path < ' a > ( i : & ' a [ u8 ] ) -> nom:: IResult < & [ u8 ] , DbPaths < ' a > > {
17
+ fn parse_path < ' a > ( i : & ' a [ u8 ] ) -> nom:: IResult < & [ u8 ] , DbPaths > {
18
18
let prefix = "{\" basePath\" :\" " ;
19
19
let suffix = "\" ,\" totalSize\" " ;
20
20
let ( i, _taken) = take_until ( prefix) ( i) ?;
21
21
let ( i, _taken) = tag ( prefix) ( i) ?;
22
22
let ( i, base_path) = take_until ( suffix) ( i) ?;
23
- let base_path_str = std:: str:: from_utf8 ( base_path) ;
24
- let base_path = match base_path_str{
25
- Ok ( base_path) => base_path,
26
- Err ( e) => {
27
- return convert_to_nom_error ( i, e) ;
28
- } ,
29
- } ;
23
+ let base_path = String :: from_utf8_lossy ( base_path) . to_string ( ) ;
30
24
31
25
let prefix = ":[{\" path\" :\" " ;
32
26
let suffix = "\" ,\" depth" ;
33
27
let ( i, _taken) = take_until ( prefix) ( i) ?;
34
28
let ( i, _taken) = tag ( prefix) ( i) ?;
35
29
let ( i, path) = take_until ( suffix) ( i) ?;
36
- let path_str = std:: str:: from_utf8 ( path) ;
37
- let path = match path_str{
38
- Ok ( path) => path,
39
- Err ( e) => {
40
- return convert_to_nom_error ( i, e) ;
41
- } ,
42
- } ;
30
+ let path = String :: from_utf8_lossy ( path) . to_string ( ) ;
43
31
44
32
IResult :: Ok ( (
45
33
i,
@@ -50,12 +38,6 @@ fn parse_path<'a>(i: &'a [u8]) -> nom::IResult<&[u8], DbPaths<'a>> {
50
38
) )
51
39
}
52
40
53
- fn convert_to_nom_error ( i : & [ u8 ] , e : std:: str:: Utf8Error ) -> Result < ( & [ u8 ] , DbPaths ) , nom:: Err < nom:: error:: Error < & [ u8 ] > > > {
54
- use nom:: error:: * ;
55
- IResult :: Err ( nom:: Err :: Error ( Error :: from_external_error ( i, ErrorKind :: AlphaNumeric , e) ) )
56
-
57
- }
58
-
59
41
#[ cfg( test) ]
60
42
mod tests {
61
43
@@ -91,4 +73,21 @@ mod tests {
91
73
assert_eq ! ( paths[ 5 ] . base_path, "/home/philip/.config/itch/apps/islands" ) ;
92
74
assert_eq ! ( paths[ 5 ] . path, "Islands_Linux.x86_64" ) ;
93
75
}
76
+
77
+ #[ test]
78
+ fn parse_itch_butler_db_test_other ( ) {
79
+ let content = include_bytes ! ( "../testdata/itch/other-butler.db-wal" ) ;
80
+ let result = parse_butler_db ( content) ;
81
+ assert ! ( result. is_ok( ) ) ;
82
+ let ( _r, paths) = result. unwrap ( ) ;
83
+ assert_eq ! ( paths. len( ) , 94 ) ;
84
+
85
+ assert_eq ! ( paths[ 0 ] . base_path, "/home/deck/.config/itch/apps/risetoruins" ) ;
86
+ assert_eq ! ( paths[ 0 ] . path, "Core.jar" ) ;
87
+ //The parser finds douplicates
88
+ assert_eq ! ( paths[ 0 ] , paths[ 1 ] ) ;
89
+ assert_eq ! ( paths[ 1 ] , paths[ 2 ] ) ;
90
+
91
+
92
+ }
94
93
}
0 commit comments