Skip to content

Commit 71cbf82

Browse files
committed
Using linear map for VCF header record key/value pairs.
1 parent a88c088 commit 71cbf82

File tree

4 files changed

+22
-42
lines changed

4 files changed

+22
-42
lines changed

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ lazy_static = "0.2"
2323
bitflags = "0.9"
2424
serde = { version = "^1", optional = true }
2525
regex = "0.2"
26+
linear-map = "1.2.0"
2627

2728
[features]
2829
default = []

src/bcf/header.rs

+17-40
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ use std::str;
99

1010
use htslib;
1111

12+
use linear_map::LinearMap;
13+
1214
pub type SampleSubset = Vec<i32>;
1315

1416
custom_derive! {
@@ -195,30 +197,15 @@ impl Drop for Header {
195197
#[derive(Debug)]
196198
pub enum HeaderRecord {
197199
/// 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> },
202201
/// 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> },
207203
/// 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> },
212205
/// 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> },
217207
/// 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> },
222209
/// A generic, unstructured header record.
223210
Generic { key: String, value: String },
224211
}
@@ -375,22 +362,12 @@ impl HeaderView {
375362

376363
/// Return structured `HeaderRecord`s.
377364
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();
380367
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);
394371
}
395372
result
396373
}
@@ -402,23 +379,23 @@ impl HeaderView {
402379
let record = match rec.type_ {
403380
0 => HeaderRecord::Filter {
404381
key,
405-
key_value_pairs: parse_kv(rec),
382+
values: parse_kv(rec),
406383
},
407384
1 => HeaderRecord::Info {
408385
key,
409-
key_value_pairs: parse_kv(rec),
386+
values: parse_kv(rec),
410387
},
411388
2 => HeaderRecord::Format {
412389
key,
413-
key_value_pairs: parse_kv(rec),
390+
values: parse_kv(rec),
414391
},
415392
3 => HeaderRecord::Contig {
416393
key,
417-
key_value_pairs: parse_kv(rec),
394+
values: parse_kv(rec),
418395
},
419396
4 => HeaderRecord::Structured {
420397
key,
421-
key_value_pairs: parse_kv(rec),
398+
values: parse_kv(rec),
422399
},
423400
5 => HeaderRecord::Generic {
424401
key,

src/bcf/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -850,10 +850,10 @@ mod tests {
850850
match &records[0] {
851851
&HeaderRecord::Filter {
852852
ref key,
853-
ref key_value_pairs,
853+
ref values,
854854
} => {
855855
assert_eq!(key, "FILTER");
856-
assert_eq!(key_value_pairs[0], ("ID".to_string(), "PASS".to_string()));
856+
assert_eq!(values["ID"], "PASS");
857857
}
858858
_ => {
859859
assert!(false);

src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ extern crate quick_error;
8383
extern crate regex;
8484
extern crate url;
8585

86+
extern crate linear_map;
87+
8688
#[cfg(feature = "serde")]
8789
extern crate serde;
8890

0 commit comments

Comments
 (0)