noodles_bcf/record/
info.rs1mod 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#[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 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}