noodles_bcf/record/codec/decoder/
quality_score.rs1use std::io;
2
3use crate::io::reader::num::read_f32_le;
4
5pub(crate) fn read_qual(src: &mut &[u8]) -> io::Result<Option<f32>> {
6 use crate::record::codec::value::Float;
7
8 match read_f32_le(src).map(Float::from)? {
9 Float::Value(n) => Ok(Some(n)),
10 Float::Missing => Ok(None),
11 qual => Err(io::Error::new(
12 io::ErrorKind::InvalidInput,
13 format!("invalid qual: {qual:?}"),
14 )),
15 }
16}
17
18#[cfg(test)]
19mod tests {
20 use super::*;
21
22 #[test]
23 fn test_read_qual() -> io::Result<()> {
24 let mut src = &[0x01, 0x00, 0x80, 0x7f][..];
25 assert!(read_qual(&mut src)?.is_none());
26
27 let mut src = &[0x00, 0x00, 0x00, 0x00][..];
28 assert_eq!(read_qual(&mut src)?, Some(0.0));
29
30 let mut src = &[0x02, 0x00, 0x80, 0x7f][..];
31 assert!(matches!(
32 read_qual(&mut src),
33 Err(e) if e.kind() == io::ErrorKind::InvalidInput
34 ));
35
36 Ok(())
37 }
38}