@@ -9,6 +9,8 @@ use std::str;
9
9
10
10
use htslib;
11
11
12
+ use linear_map:: LinearMap ;
13
+
12
14
pub type SampleSubset = Vec < i32 > ;
13
15
14
16
custom_derive ! {
@@ -195,30 +197,15 @@ impl Drop for Header {
195
197
#[ derive( Debug ) ]
196
198
pub enum HeaderRecord {
197
199
/// A `FILTER` header record.
198
- Filter {
199
- key : String ,
200
- key_value_pairs : Vec < ( String , String ) > ,
201
- } ,
200
+ Filter { key : String , values : LinearMap < String , String > } ,
202
201
/// An `INFO` header record.
203
- Info {
204
- key : String ,
205
- key_value_pairs : Vec < ( String , String ) > ,
206
- } ,
202
+ Info { key : String , values : LinearMap < String , String > } ,
207
203
/// A `FORMAT` header record.
208
- Format {
209
- key : String ,
210
- key_value_pairs : Vec < ( String , String ) > ,
211
- } ,
204
+ Format { key : String , values : LinearMap < String , String > } ,
212
205
/// A `contig` header record.
213
- Contig {
214
- key : String ,
215
- key_value_pairs : Vec < ( String , String ) > ,
216
- } ,
206
+ Contig { key : String , values : LinearMap < String , String > } ,
217
207
/// A structured header record.
218
- Structured {
219
- key : String ,
220
- key_value_pairs : Vec < ( String , String ) > ,
221
- } ,
208
+ Structured { key : String , values : LinearMap < String , String > } ,
222
209
/// A generic, unstructured header record.
223
210
Generic { key : String , value : String } ,
224
211
}
@@ -375,22 +362,12 @@ impl HeaderView {
375
362
376
363
/// Return structured `HeaderRecord`s.
377
364
pub fn header_records ( & self ) -> Vec < HeaderRecord > {
378
- fn parse_kv ( rec : & htslib:: bcf_hrec_t ) -> Vec < ( String , String ) > {
379
- let mut result: Vec < ( String , String ) > = Vec :: new ( ) ;
365
+ fn parse_kv ( rec : & htslib:: bcf_hrec_t ) -> LinearMap < String , String > {
366
+ let mut result: LinearMap < String , String > = LinearMap :: new ( ) ;
380
367
for i in 0_i32 ..( rec. nkeys ) {
381
- let key = unsafe {
382
- ffi:: CStr :: from_ptr ( * rec. keys . offset ( i as isize ) )
383
- . to_str ( )
384
- . unwrap ( )
385
- . to_string ( )
386
- } ;
387
- let value = unsafe {
388
- ffi:: CStr :: from_ptr ( * rec. vals . offset ( i as isize ) )
389
- . to_str ( )
390
- . unwrap ( )
391
- . to_string ( )
392
- } ;
393
- result. push ( ( key, value) ) ;
368
+ let key = unsafe { ffi:: CStr :: from_ptr ( * rec. keys . offset ( i as isize ) ) . to_str ( ) . unwrap ( ) . to_string ( ) } ;
369
+ let value = unsafe { ffi:: CStr :: from_ptr ( * rec. vals . offset ( i as isize ) ) . to_str ( ) . unwrap ( ) . to_string ( ) } ;
370
+ result. insert ( key, value) ;
394
371
}
395
372
result
396
373
}
@@ -402,23 +379,23 @@ impl HeaderView {
402
379
let record = match rec. type_ {
403
380
0 => HeaderRecord :: Filter {
404
381
key,
405
- key_value_pairs : parse_kv ( rec) ,
382
+ values : parse_kv ( rec) ,
406
383
} ,
407
384
1 => HeaderRecord :: Info {
408
385
key,
409
- key_value_pairs : parse_kv ( rec) ,
386
+ values : parse_kv ( rec) ,
410
387
} ,
411
388
2 => HeaderRecord :: Format {
412
389
key,
413
- key_value_pairs : parse_kv ( rec) ,
390
+ values : parse_kv ( rec) ,
414
391
} ,
415
392
3 => HeaderRecord :: Contig {
416
393
key,
417
- key_value_pairs : parse_kv ( rec) ,
394
+ values : parse_kv ( rec) ,
418
395
} ,
419
396
4 => HeaderRecord :: Structured {
420
397
key,
421
- key_value_pairs : parse_kv ( rec) ,
398
+ values : parse_kv ( rec) ,
422
399
} ,
423
400
5 => HeaderRecord :: Generic {
424
401
key,
0 commit comments