diff --git a/src/bcf/mod.rs b/src/bcf/mod.rs index 7669911be..e09521599 100644 --- a/src/bcf/mod.rs +++ b/src/bcf/mod.rs @@ -1548,6 +1548,24 @@ mod tests { ); } + #[test] + fn test_trailing_omitted_format_fields() { + let mut reader = Reader::from_path("test/test_trailing_omitted_format.vcf").unwrap(); + let first_record = reader + .records() + .next() + .unwrap() + .expect("Fail to read record"); + + let expected: Vec<&[u8]> = Vec::new(); + assert_eq!(*first_record.format(b"STR").string().unwrap(), expected,); + assert_eq!( + *first_record.format(b"INT").integer().unwrap(), + vec![&[i32::missing()]], + ); + assert!(first_record.format(b"FLT").float().unwrap()[0][0].is_nan(),); + } + // #[test] // fn test_buffer_lifetime() { // let mut reader = Reader::from_path("test/obs-cornercase.vcf").unwrap(); diff --git a/src/bcf/record.rs b/src/bcf/record.rs index b8f18871a..a5778d1ac 100644 --- a/src/bcf/record.rs +++ b/src/bcf/record.rs @@ -1483,6 +1483,9 @@ impl<'a, 'b, B: BorrowMut + Borrow + 'b> Format<'a, B> { /// memory. pub fn string(mut self) -> Result, B>> { self.data(htslib::BCF_HT_STR).map(|ret| { + if ret == 0 { + return BufferBacked::new(Vec::new(), self.buffer); + } BufferBacked::new( unsafe { slice::from_raw_parts(self.buffer.borrow_mut().inner as *const u8, ret as usize) diff --git a/test/test_trailing_omitted_format.vcf b/test/test_trailing_omitted_format.vcf new file mode 100644 index 000000000..68892198b --- /dev/null +++ b/test/test_trailing_omitted_format.vcf @@ -0,0 +1,9 @@ +##fileformat=VCFv4.3 +##contig= +##INFO= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 +chr1 1234 . t a . . FOO=1 GT:STR:FLT:INT .