1
1
use ordermap:: OrderMap ;
2
2
3
- pub fn kvlm_parse (
4
- raw : & [ u8 ] ,
5
- start : usize ,
6
- mut dct : Option < OrderMap < Option < Vec < u8 > > , Vec < u8 > > > ,
7
- ) -> OrderMap < Option < Vec < u8 > > , Vec < u8 > > {
3
+ type Value = Vec < Vec < u8 > > ;
4
+
5
+ pub type Dict = OrderMap < Option < Vec < u8 > > , Value > ;
6
+
7
+ pub fn kvlm_parse ( raw : & [ u8 ] , start : usize , mut dct : Option < Dict > ) -> Dict {
8
8
if dct. is_none ( ) {
9
9
dct = Some ( OrderMap :: new ( ) ) ;
10
10
}
@@ -21,7 +21,8 @@ pub fn kvlm_parse(
21
21
22
22
if spc. is_none ( ) || ( nl. is_some ( ) && nl. unwrap ( ) < spc. unwrap ( ) ) {
23
23
assert_eq ! ( nl. unwrap( ) , start) ;
24
- dct. insert ( None , raw[ start + 1 ..] . to_vec ( ) ) ;
24
+ dct. insert ( None , vec ! [ raw[ start + 1 ..] . to_vec( ) ] ) ;
25
+
25
26
return dct;
26
27
}
27
28
@@ -55,40 +56,44 @@ pub fn kvlm_parse(
55
56
}
56
57
57
58
if let Some ( existing_value) = dct. get_mut ( & Some ( key. to_vec ( ) ) ) {
58
- if existing_value. is_empty ( ) {
59
- * existing_value = value;
60
- } else {
61
- existing_value. extend ( value) ;
62
- }
59
+ existing_value. push ( value) ;
63
60
} else {
64
- dct. insert ( Some ( key. to_vec ( ) ) , value) ;
61
+ dct. insert ( Some ( key. to_vec ( ) ) , vec ! [ value] ) ;
65
62
}
66
63
67
64
kvlm_parse ( raw, end + 1 , Some ( dct) )
68
65
}
69
66
70
- pub fn kvlm_serialize ( kvlm : OrderMap < Option < Vec < u8 > > , Vec < u8 > > ) -> Vec < u8 > {
67
+ pub fn kvlm_serialize ( kvlm : Dict ) -> Vec < u8 > {
71
68
let mut ret: Vec < u8 > = Vec :: new ( ) ;
72
69
for key in kvlm. keys ( ) {
73
70
if key. is_none ( ) {
74
71
continue ;
75
72
}
76
73
let val = kvlm. get ( key) . unwrap ( ) ;
77
- let val = val. clone ( ) ;
78
74
79
75
for v in val. iter ( ) {
80
76
ret. extend ( key. clone ( ) . unwrap ( ) ) ;
81
77
ret. push ( b' ' ) ;
82
- if * v == b'\n' {
83
- ret. extend ( b"\n " ) ;
84
- }
78
+ v. iter ( ) . for_each ( |c| {
79
+ if * c == b'\n' {
80
+ ret. extend ( b"\n " ) ;
81
+ } else {
82
+ ret. push ( * c) ;
83
+ }
84
+ } ) ;
85
85
ret. push ( b'\n' ) ;
86
86
}
87
87
}
88
88
89
89
// Append the message
90
90
ret. push ( b'\n' ) ;
91
- ret. extend ( kvlm. get ( & None ) . unwrap ( ) ) ;
91
+ ret. extend (
92
+ kvlm. get ( & None )
93
+ . unwrap ( )
94
+ . iter ( )
95
+ . flat_map ( |x| x. iter ( ) . cloned ( ) ) ,
96
+ ) ;
92
97
ret. push ( b'\n' ) ;
93
98
94
99
ret
@@ -126,29 +131,35 @@ Create first draft";
126
131
let map = kvlm_parse ( raw, 0 , None ) ;
127
132
128
133
assert_eq ! ( map. len( ) , 6 ) ;
134
+
129
135
assert_eq ! (
130
136
map. get( & Some ( b"tree" . to_vec( ) ) ) . unwrap( ) ,
131
- b"29ff16c9c14e2652b22f8b78bb08a5a07930c147"
137
+ & vec! [ b"29ff16c9c14e2652b22f8b78bb08a5a07930c147" . to_vec ( ) ]
132
138
) ;
139
+
133
140
assert_eq ! (
134
141
map. get( & Some ( b"parent" . to_vec( ) ) ) . unwrap( ) ,
135
- b"206941306e8a8af65b66eaaaea388a7ae24d49a0"
142
+ & vec! [ b"206941306e8a8af65b66eaaaea388a7ae24d49a0" . to_vec ( ) ]
136
143
) ;
144
+
137
145
assert_eq ! (
138
146
map. get( & Some ( b"author" . to_vec( ) ) ) . unwrap( ) ,
139
- b"Thibault Polge <[email protected] > 1527025023 +0200"
147
+ & vec! [ b"Thibault Polge <[email protected] > 1527025023 +0200" . to_vec ( ) ]
140
148
) ;
141
149
assert_eq ! (
142
150
map. get( & Some ( b"committer" . to_vec( ) ) ) . unwrap( ) ,
143
- b"Thibault Polge <[email protected] > 1527025044 +0200"
151
+ & vec! [ b"Thibault Polge <[email protected] > 1527025044 +0200" . to_vec ( ) ]
144
152
) ;
153
+
145
154
assert_eq ! (
146
155
map. get( & Some ( b"gpgsig" . to_vec( ) ) ) . unwrap( ) ,
147
- b"-----BEGIN PGP SIGNATURE-----"
156
+ & vec! [ b"-----BEGIN PGP SIGNATURE-----" . to_vec ( ) ]
148
157
) ;
158
+
149
159
assert_eq ! (
150
160
map. get( & None ) . unwrap( ) ,
151
- b" iQIzBAABCAAdFiEExwXquOM8bWb4Q2zVGxM2FxoLkGQFAlsEjZQACgkQGxM2FxoL
161
+ & vec![
162
+ b" iQIzBAABCAAdFiEExwXquOM8bWb4Q2zVGxM2FxoLkGQFAlsEjZQACgkQGxM2FxoL
152
163
kGQdcBAAqPP+ln4nGDd2gETXjvOpOxLzIMEw4A9gU6CzWzm+oB8mEIKyaH0UFIPh
153
164
rNUZ1j7/ZGFNeBDtT55LPdPIQw4KKlcf6kC8MPWP3qSu3xHqx12C5zyai2duFZUU
154
165
wqOt9iCFCscFQYqKs3xsHI+ncQb+PGjVZA8+jPw7nrPIkeSXQV2aZb1E68wa2YIL
@@ -164,6 +175,8 @@ Create first draft";
164
175
-----END PGP SIGNATURE-----
165
176
166
177
Create first draft"
178
+ . to_vec( )
179
+ ]
167
180
) ;
168
181
}
169
182
}
0 commit comments