noodles_vcf/variant/record/
samples.rs

1//! Variant record samples.
2
3pub mod keys;
4mod sample;
5pub mod series;
6
7use std::io;
8
9pub use self::{sample::Sample, series::Series};
10use crate::Header;
11
12#[allow(clippy::tabs_in_doc_comments)]
13/// Variant record samples.
14///
15/// Variant record samples are described similarly to a data frame: rows and columns are samples
16/// and series, respectively.
17///
18/// Take, for example, the following samples in a VCF record.
19///
20/// ```text
21/// FORMAT	sample1	sample2	sample3
22/// GT:GQ:DP	0|0:21:1	1|0:34:2	1/1:55:5
23/// ```
24///
25/// This trait provides an interface over this data as a table.
26///
27/// ```text
28///           GT     GQ    DP
29///         +-----+-----+-----+
30/// sample1 | 0|0 |  21 |   1 |
31/// sample2 | 1|0 |  34 |   2 |
32/// sample3 | 1/1 |  55 |   5 |
33///         +-----+-----+-----+
34/// ```
35///
36/// A sample contains the values of a row (e.g., sample1 = ["0|0", 21, 1]); and a column, the
37/// values of a series (e.g., GT = ["0|0", "1|0", "1/1"]).
38pub trait Samples {
39    /// Returns whether there are any samples.
40    fn is_empty(&self) -> bool;
41
42    /// Returns the number of samples.
43    fn len(&self) -> usize;
44
45    /// Returns the column names.
46    fn column_names<'a, 'h: 'a>(
47        &'a self,
48        header: &'h Header,
49    ) -> Box<dyn Iterator<Item = io::Result<&'a str>> + 'a>;
50
51    /// Returns the series with the given column name.
52    fn select<'a, 'h: 'a>(
53        &'a self,
54        header: &'h Header,
55        column_name: &str,
56    ) -> Option<io::Result<Box<dyn Series + 'a>>>;
57
58    /// Returns an iterator over series.
59    fn series(&self) -> Box<dyn Iterator<Item = io::Result<Box<dyn Series + '_>>> + '_>;
60
61    /// Returns an iterator over samples.
62    fn iter(&self) -> Box<dyn Iterator<Item = Box<dyn Sample + '_>> + '_>;
63}
64
65impl Samples for Box<dyn Samples + '_> {
66    fn is_empty(&self) -> bool {
67        (**self).is_empty()
68    }
69
70    fn len(&self) -> usize {
71        (**self).len()
72    }
73
74    fn column_names<'a, 'h: 'a>(
75        &'a self,
76        header: &'h Header,
77    ) -> Box<dyn Iterator<Item = io::Result<&'a str>> + 'a> {
78        (**self).column_names(header)
79    }
80
81    fn select<'a, 'h: 'a>(
82        &'a self,
83        header: &'h Header,
84        column_name: &str,
85    ) -> Option<io::Result<Box<dyn Series + 'a>>> {
86        (**self).select(header, column_name)
87    }
88
89    fn series(&self) -> Box<dyn Iterator<Item = io::Result<Box<dyn Series + '_>>> + '_> {
90        (**self).series()
91    }
92
93    fn iter(&self) -> Box<dyn Iterator<Item = Box<dyn Sample + '_>> + '_> {
94        (**self).iter()
95    }
96}