Skip to content

Commit f9a1981

Browse files
authored
fix: use correct return value in bcf_get_format and bcf_get_info_values (#398)
* fix: use correct return value in bcf_get_format and info * test: check fs1 string vector length * fix: sample count is 2 for test vcf file * refactor: replace n with ret * test: use shared buffer to test * style: run cargo fmt --------- Co-authored-by: Jialin Ma <[email protected]>
1 parent 261e3a3 commit f9a1981

File tree

2 files changed

+52
-41
lines changed

2 files changed

+52
-41
lines changed

src/bcf/mod.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1022,15 +1022,12 @@ mod tests {
10221022
.expect("Missing tag")[0],
10231023
format!("string{}", i + 1).as_bytes()
10241024
);
1025-
println!(
1026-
"{}",
1027-
String::from_utf8_lossy(
1028-
record
1029-
.format(b"FS1")
1030-
.string()
1031-
.expect("Error reading string.")[0]
1032-
)
1033-
);
1025+
let fs1_str_vec = record
1026+
.format_shared_buffer(b"FS1", &mut buffer)
1027+
.string()
1028+
.expect("Error reading string.");
1029+
assert_eq!(fs1_str_vec.len(), 2);
1030+
println!("{}", String::from_utf8_lossy(fs1_str_vec[0]));
10341031
assert_eq!(
10351032
record
10361033
.format(b"FS1")

src/bcf/record.rs

Lines changed: 46 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1251,7 +1251,7 @@ impl<'a, 'b, B: BorrowMut<Buffer> + Borrow<Buffer> + 'b> Info<'a, B> {
12511251
str::from_utf8(self.tag).unwrap().to_owned()
12521252
}
12531253

1254-
fn data(&mut self, data_type: u32) -> Result<Option<(usize, i32)>> {
1254+
fn data(&mut self, data_type: u32) -> Result<Option<i32>> {
12551255
let mut n: i32 = self.buffer.borrow().len;
12561256
let c_str = ffi::CString::new(self.tag).unwrap();
12571257
let ret = unsafe {
@@ -1270,7 +1270,7 @@ impl<'a, 'b, B: BorrowMut<Buffer> + Borrow<Buffer> + 'b> Info<'a, B> {
12701270
-1 => Err(Error::BcfUndefinedTag { tag: self.desc() }),
12711271
-2 => Err(Error::BcfUnexpectedType { tag: self.desc() }),
12721272
-3 => Ok(None),
1273-
ret => Ok(Some((n as usize, ret))),
1273+
ret => Ok(Some(ret)),
12741274
}
12751275
}
12761276

@@ -1284,9 +1284,10 @@ impl<'a, 'b, B: BorrowMut<Buffer> + Borrow<Buffer> + 'b> Info<'a, B> {
12841284
/// memory.
12851285
pub fn integer(mut self) -> Result<Option<BufferBacked<'b, &'b [i32], B>>> {
12861286
self.data(htslib::BCF_HT_INT).map(|data| {
1287-
data.map(|(n, ret)| {
1288-
let values =
1289-
unsafe { slice::from_raw_parts(self.buffer.borrow().inner as *const i32, n) };
1287+
data.map(|ret| {
1288+
let values = unsafe {
1289+
slice::from_raw_parts(self.buffer.borrow().inner as *const i32, ret as usize)
1290+
};
12901291
BufferBacked::new(&values[..ret as usize], self.buffer)
12911292
})
12921293
})
@@ -1302,9 +1303,10 @@ impl<'a, 'b, B: BorrowMut<Buffer> + Borrow<Buffer> + 'b> Info<'a, B> {
13021303
/// memory.
13031304
pub fn float(mut self) -> Result<Option<BufferBacked<'b, &'b [f32], B>>> {
13041305
self.data(htslib::BCF_HT_REAL).map(|data| {
1305-
data.map(|(n, ret)| {
1306-
let values =
1307-
unsafe { slice::from_raw_parts(self.buffer.borrow().inner as *const f32, n) };
1306+
data.map(|ret| {
1307+
let values = unsafe {
1308+
slice::from_raw_parts(self.buffer.borrow().inner as *const f32, ret as usize)
1309+
};
13081310
BufferBacked::new(&values[..ret as usize], self.buffer)
13091311
})
13101312
})
@@ -1313,7 +1315,7 @@ impl<'a, 'b, B: BorrowMut<Buffer> + Borrow<Buffer> + 'b> Info<'a, B> {
13131315
/// Get flags from tag. `false` if not set.
13141316
pub fn flag(&mut self) -> Result<bool> {
13151317
self.data(htslib::BCF_HT_FLAG).map(|data| match data {
1316-
Some((_, ret)) => ret == 1,
1318+
Some(ret) => ret == 1,
13171319
None => false,
13181320
})
13191321
}
@@ -1326,7 +1328,7 @@ impl<'a, 'b, B: BorrowMut<Buffer> + Borrow<Buffer> + 'b> Info<'a, B> {
13261328
/// memory.
13271329
pub fn string(mut self) -> Result<Option<BufferBacked<'b, Vec<&'b [u8]>, B>>> {
13281330
self.data(htslib::BCF_HT_STR).map(|data| {
1329-
data.map(|(_, ret)| {
1331+
data.map(|ret| {
13301332
BufferBacked::new(
13311333
unsafe {
13321334
slice::from_raw_parts(self.buffer.borrow().inner as *const u8, ret as usize)
@@ -1402,7 +1404,7 @@ impl<'a, 'b, B: BorrowMut<Buffer> + Borrow<Buffer> + 'b> Format<'a, B> {
14021404
}
14031405

14041406
/// Read and decode format data into a given type.
1405-
fn data(&mut self, data_type: u32) -> Result<(usize, i32)> {
1407+
fn data(&mut self, data_type: u32) -> Result<i32> {
14061408
let mut n: i32 = self.buffer.borrow().len;
14071409
let c_str = ffi::CString::new(self.tag).unwrap();
14081410
let ret = unsafe {
@@ -1423,7 +1425,7 @@ impl<'a, 'b, B: BorrowMut<Buffer> + Borrow<Buffer> + 'b> Format<'a, B> {
14231425
tag: self.desc(),
14241426
record: self.record.desc(),
14251427
}),
1426-
ret => Ok((n as usize, ret)),
1428+
ret => Ok(ret),
14271429
}
14281430
}
14291431

@@ -1434,12 +1436,17 @@ impl<'a, 'b, B: BorrowMut<Buffer> + Borrow<Buffer> + 'b> Format<'a, B> {
14341436
/// the BufferBacked object is already dropped, you will access unallocated
14351437
/// memory.
14361438
pub fn integer(mut self) -> Result<BufferBacked<'b, Vec<&'b [i32]>, B>> {
1437-
self.data(htslib::BCF_HT_INT).map(|(n, _)| {
1439+
self.data(htslib::BCF_HT_INT).map(|ret| {
14381440
BufferBacked::new(
1439-
unsafe { slice::from_raw_parts(self.buffer.borrow_mut().inner as *const i32, n) }
1440-
.chunks(self.values_per_sample())
1441-
.map(|s| trim_slice(s))
1442-
.collect(),
1441+
unsafe {
1442+
slice::from_raw_parts(
1443+
self.buffer.borrow_mut().inner as *const i32,
1444+
ret as usize,
1445+
)
1446+
}
1447+
.chunks(self.values_per_sample())
1448+
.map(|s| trim_slice(s))
1449+
.collect(),
14431450
self.buffer,
14441451
)
14451452
})
@@ -1452,12 +1459,17 @@ impl<'a, 'b, B: BorrowMut<Buffer> + Borrow<Buffer> + 'b> Format<'a, B> {
14521459
/// the BufferBacked object is already dropped, you will access unallocated
14531460
/// memory.
14541461
pub fn float(mut self) -> Result<BufferBacked<'b, Vec<&'b [f32]>, B>> {
1455-
self.data(htslib::BCF_HT_REAL).map(|(n, _)| {
1462+
self.data(htslib::BCF_HT_REAL).map(|ret| {
14561463
BufferBacked::new(
1457-
unsafe { slice::from_raw_parts(self.buffer.borrow_mut().inner as *const f32, n) }
1458-
.chunks(self.values_per_sample())
1459-
.map(|s| trim_slice(s))
1460-
.collect(),
1464+
unsafe {
1465+
slice::from_raw_parts(
1466+
self.buffer.borrow_mut().inner as *const f32,
1467+
ret as usize,
1468+
)
1469+
}
1470+
.chunks(self.values_per_sample())
1471+
.map(|s| trim_slice(s))
1472+
.collect(),
14611473
self.buffer,
14621474
)
14631475
})
@@ -1470,17 +1482,19 @@ impl<'a, 'b, B: BorrowMut<Buffer> + Borrow<Buffer> + 'b> Format<'a, B> {
14701482
/// the BufferBacked object is already dropped, you will access unallocated
14711483
/// memory.
14721484
pub fn string(mut self) -> Result<BufferBacked<'b, Vec<&'b [u8]>, B>> {
1473-
self.data(htslib::BCF_HT_STR).map(|(n, _)| {
1485+
self.data(htslib::BCF_HT_STR).map(|ret| {
14741486
BufferBacked::new(
1475-
unsafe { slice::from_raw_parts(self.buffer.borrow_mut().inner as *const u8, n) }
1476-
.chunks(self.values_per_sample())
1477-
.map(|s| {
1478-
// stop at zero character
1479-
s.split(|c| *c == 0u8)
1480-
.next()
1481-
.expect("Bug: returned string should not be empty.")
1482-
})
1483-
.collect(),
1487+
unsafe {
1488+
slice::from_raw_parts(self.buffer.borrow_mut().inner as *const u8, ret as usize)
1489+
}
1490+
.chunks(self.values_per_sample())
1491+
.map(|s| {
1492+
// stop at zero character
1493+
s.split(|c| *c == 0u8)
1494+
.next()
1495+
.expect("Bug: returned string should not be empty.")
1496+
})
1497+
.collect(),
14841498
self.buffer,
14851499
)
14861500
})

0 commit comments

Comments
 (0)