Skip to main content

noodles_bcf/record/codec/decoder/
quality_score.rs

1use 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}