noodles_bcf/record/
info.rs

1mod field;
2
3use std::io;
4
5use noodles_vcf::{
6    self as vcf,
7    variant::record::{info::field::Value, Info as _},
8};
9
10use self::field::read_field;
11
12/// BCF record info.
13#[derive(Clone, Debug, Default, Eq, PartialEq)]
14pub struct Info<'r> {
15    src: &'r [u8],
16    field_count: usize,
17}
18
19impl<'r> Info<'r> {
20    pub(super) fn new(src: &'r [u8], field_count: usize) -> Self {
21        Self { src, field_count }
22    }
23
24    /// Returns the value with the given key.
25    pub fn get<'h: 'r>(
26        &'r self,
27        header: &'h vcf::Header,
28        key: &str,
29    ) -> Option<io::Result<Option<Value<'r>>>> {
30        for result in self.iter(header) {
31            match result {
32                Ok((k, v)) => {
33                    if k == key {
34                        return Some(Ok(v));
35                    }
36                }
37                Err(e) => return Some(Err(e)),
38            }
39        }
40
41        None
42    }
43}
44
45impl AsRef<[u8]> for Info<'_> {
46    fn as_ref(&self) -> &[u8] {
47        self.src
48    }
49}
50
51impl vcf::variant::record::Info for Info<'_> {
52    fn is_empty(&self) -> bool {
53        self.len() == 0
54    }
55
56    fn len(&self) -> usize {
57        self.field_count
58    }
59
60    fn get<'a, 'h: 'a>(
61        &'a self,
62        header: &'h vcf::Header,
63        key: &str,
64    ) -> Option<io::Result<Option<Value<'a>>>> {
65        self.get(header, key)
66    }
67
68    fn iter<'a, 'h: 'a>(
69        &'a self,
70        header: &'h vcf::Header,
71    ) -> Box<dyn Iterator<Item = io::Result<(&'a str, Option<Value<'a>>)>> + 'a> {
72        let mut src = self.as_ref();
73
74        Box::new((0..self.len()).map(move |_| {
75            read_field(&mut src, header).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))
76        }))
77    }
78}