@@ -6,19 +6,20 @@ use std::fs::File;
6
6
use std:: env;
7
7
use quick_xml:: Reader ;
8
8
use quick_xml:: events:: Event ;
9
- use yaml_rust:: { Yaml , YamlLoader } ;
9
+ use yaml_rust:: YamlLoader ;
10
10
11
11
#[ derive( Debug ) ]
12
12
struct Column {
13
13
name : String ,
14
14
path : String ,
15
- value : String
15
+ value : String ,
16
+ raw : bool
16
17
}
17
18
18
19
fn main ( ) {
19
20
let args: Vec < _ > = env:: args ( ) . collect ( ) ;
20
21
if args. len ( ) != 3 {
21
- println ! ( "usage: {} <configfile> <xmlfile>" , args[ 0 ] ) ;
22
+ eprintln ! ( "usage: {} <configfile> <xmlfile>" , args[ 0 ] ) ;
22
23
return ;
23
24
}
24
25
@@ -37,30 +38,47 @@ fn main() {
37
38
38
39
let rowpath = config[ "rowpath" ] . as_str ( ) . expect ( "No valid 'rowpath' entry in configuration file" ) ;
39
40
let colspec = config[ "columns" ] . as_vec ( ) . expect ( "No valid 'columns' array in configuration file" ) ;
40
- let namefield = & Yaml :: from_str ( "name" ) ;
41
- let pathfield = & Yaml :: from_str ( "path" ) ;
42
41
let mut columns = Vec :: new ( ) ;
43
42
44
43
for col in colspec {
45
- let hash = col. as_hash ( ) . expect ( "Column entry is not a valid hash" ) ;
46
- let name = hash[ namefield] . as_str ( ) . unwrap ( ) ;
47
- let colpath = hash[ pathfield] . as_str ( ) . unwrap ( ) ;
48
- println ! ( "Column name {} path {}" , name, colpath) ;
44
+ let name = col[ "name" ] . as_str ( ) . unwrap ( ) ;
45
+ let mut raw = false ;
46
+ if !col[ "raw" ] . is_badvalue ( ) { raw = col[ "raw" ] . as_bool ( ) . unwrap ( ) }
47
+ let colpath = col[ "path" ] . as_str ( ) . unwrap ( ) ;
48
+ // println!("Column name {} path {}", name, colpath);
49
49
let mut path = String :: from ( rowpath) ;
50
50
path. push_str ( colpath) ;
51
- columns. push ( Column { name : name. to_string ( ) , path : path, value : String :: new ( ) } ) ;
51
+ columns. push ( Column { name : name. to_string ( ) , path : path, value : String :: new ( ) , raw : raw } ) ;
52
52
}
53
53
54
+ let mut raw = false ;
55
+ let mut rawstr = String :: new ( ) ;
54
56
loop {
55
57
match reader. read_event ( & mut buf) {
56
58
Ok ( Event :: Start ( ref e) ) => {
57
59
path. push ( '/' ) ;
58
60
path. push_str ( reader. decode ( e. name ( ) ) . unwrap ( ) ) ;
59
- if path == rowpath {
61
+ if raw {
62
+ rawstr. push_str ( & format ! ( "<{}>" , & e. unescape_and_decode( & reader) . unwrap( ) ) ) ;
63
+ continue ;
64
+ }
65
+ else if path == rowpath {
60
66
count += 1 ;
61
67
}
68
+ else if path. len ( ) > rowpath. len ( ) {
69
+ for i in 0 ..columns. len ( ) {
70
+ if path == columns[ i] . path {
71
+ if columns[ i] . raw { raw = true ; }
72
+ break ;
73
+ }
74
+ }
75
+ }
62
76
} ,
63
77
Ok ( Event :: Text ( ref e) ) => {
78
+ if raw {
79
+ rawstr. push_str ( & e. unescape_and_decode ( & reader) . unwrap ( ) ) ;
80
+ continue ;
81
+ }
64
82
for i in 0 ..columns. len ( ) {
65
83
if path == columns[ i] . path {
66
84
columns[ i] . value . push_str ( & e. unescape_and_decode ( & reader) . unwrap ( ) ) ;
@@ -69,17 +87,35 @@ fn main() {
69
87
} ,
70
88
Ok ( Event :: End ( _) ) => {
71
89
if path == rowpath {
72
- println ! ( "Insert row with id {}" , columns[ 0 ] . value) ;
73
- for i in 0 ..columns. len ( ) { columns[ i] . value . clear ( ) ; }
90
+ for i in 0 ..columns. len ( ) {
91
+ if i > 0 { print ! ( "\t " ) ; }
92
+ if columns[ i] . value . is_empty ( ) { print ! ( "\\ N" ) ; }
93
+ else {
94
+ print ! ( "{}" , columns[ i] . value) ;
95
+ columns[ i] . value . clear ( ) ;
96
+ }
97
+ }
98
+ println ! ( "" ) ;
74
99
}
75
100
let i = path. rfind ( '/' ) . unwrap ( ) ;
76
- let _ = path. split_off ( i) ;
101
+ let tag = path. split_off ( i) ;
102
+ if raw {
103
+ rawstr. push_str ( & format ! ( "<{}>" , tag) ) ;
104
+ for i in 0 ..columns. len ( ) {
105
+ if path == columns[ i] . path {
106
+ raw = false ;
107
+ columns[ i] . value . push_str ( & rawstr) ;
108
+ rawstr. clear ( ) ;
109
+ break ;
110
+ }
111
+ }
112
+ }
77
113
} ,
78
114
Ok ( Event :: Eof ) => break ,
79
115
Err ( e) => panic ! ( "Error at position {}: {:?}" , reader. buffer_position( ) , e) ,
80
116
_ => ( )
81
117
}
82
118
buf. clear ( ) ;
83
119
}
84
- println ! ( "{} rows processed" , count) ;
120
+ eprintln ! ( "{} rows processed" , count) ;
85
121
}
0 commit comments